From b8b879af45754ee70861834d14d3c9af7108d409 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Tue, 23 May 2017 15:29:11 -0500 Subject: [PATCH 01/80] Gibtonite now uses defines --- code/__DEFINES/misc.dm | 6 ++++++ code/game/turfs/simulated/minerals.dm | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 8b02a61fba..6a7e3b3b2e 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -411,3 +411,9 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define NO_FIELD 0 #define FIELD_TURF 1 #define FIELD_EDGE 2 + +//gibtonite state defines +#define GIBTONITE_UNSTRUCK 0 +#define GIBTONITE_ACTIVE 1 +#define GIBTONITE_STABLE 2 +#define GIBTONITE_DETONATE 3 \ No newline at end of file diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 708427a11a..0a8230e186 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -379,7 +379,7 @@ spread = 0 scan_state = "rock_Gibtonite" var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it - var/stage = 0 //How far into the lifecycle of gibtonite we are, 0 is untouched, 1 is active and attempting to detonate, 2 is benign and ready for extraction + var/stage = GIBTONITE_UNSTRUCK //How far into the lifecycle of gibtonite we are var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes var/activated_name = null var/mutable_appearance/activated_overlay @@ -395,12 +395,12 @@ ..() /turf/closed/mineral/gibtonite/proc/explosive_reaction(mob/user = null, triggered_by_explosion = 0) - if(stage == 0) + if(stage == GIBTONITE_UNSTRUCK) activated_overlay = mutable_appearance('icons/turf/smoothrocks.dmi', "rock_Gibtonite_active", ON_EDGED_TURF_LAYER) add_overlay(activated_overlay) name = "gibtonite deposit" desc = "An active gibtonite reserve. Run!" - stage = 1 + stage = GIBTONITE_ACTIVE visible_message("There was gibtonite inside! It's going to explode!") var/turf/bombturf = get_turf(src) var/area/A = get_area(bombturf) @@ -422,38 +422,38 @@ /turf/closed/mineral/gibtonite/proc/countdown(notify_admins = 0) set waitfor = 0 - while(istype(src, /turf/closed/mineral/gibtonite) && stage == 1 && det_time > 0 && mineralAmt >= 1) + while(istype(src, /turf/closed/mineral/gibtonite) && stage == GIBTONITE_ACTIVE && det_time > 0 && mineralAmt >= 1) det_time-- sleep(5) if(istype(src, /turf/closed/mineral/gibtonite)) - if(stage == 1 && det_time <= 0 && mineralAmt >= 1) + if(stage == GIBTONITE_ACTIVE && det_time <= 0 && mineralAmt >= 1) var/turf/bombturf = get_turf(src) mineralAmt = 0 - stage = 3 + stage = GIBTONITE_DETONATE explosion(bombturf,1,3,5, adminlog = notify_admins) /turf/closed/mineral/gibtonite/proc/defuse() - if(stage == 1) + if(stage == GIBTONITE_ACTIVE) cut_overlay(activated_overlay) activated_overlay.icon_state = "rock_Gibtonite_inactive" add_overlay(activated_overlay) desc = "An inactive gibtonite reserve. The ore can be extracted." - stage = 2 + stage = GIBTONITE_STABLE if(det_time < 0) det_time = 0 visible_message("The chain reaction was stopped! The gibtonite had [src.det_time] reactions left till the explosion!") /turf/closed/mineral/gibtonite/gets_drilled(mob/user, triggered_by_explosion = 0) - if(stage == 0 && mineralAmt >= 1) //Gibtonite deposit is activated + if(stage == GIBTONITE_UNSTRUCK && mineralAmt >= 1) //Gibtonite deposit is activated playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1) explosive_reaction(user, triggered_by_explosion) return - if(stage == 1 && mineralAmt >= 1) //Gibtonite deposit goes kaboom + if(stage == GIBTONITE_ACTIVE && mineralAmt >= 1) //Gibtonite deposit goes kaboom var/turf/bombturf = get_turf(src) mineralAmt = 0 - stage = 3 + stage = GIBTONITE_DETONATE explosion(bombturf,1,2,5, adminlog = 0) - if(stage == 2) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore. + if(stage == GIBTONITE_STABLE) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore. var/obj/item/weapon/twohanded/required/gibtonite/G = new /obj/item/weapon/twohanded/required/gibtonite/(src) if(det_time <= 0) G.quality = 3 From b42e5c8721ea4f1a8451ce3b90ea1e92158f6b74 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 May 2017 16:15:47 -0500 Subject: [PATCH 02/80] Fixes clock cultists not getting their "objective" --- code/datums/antagonists/datum_clockcult.dm | 5 ++--- code/game/gamemodes/clock_cult/clock_cult.dm | 8 -------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/code/datums/antagonists/datum_clockcult.dm b/code/datums/antagonists/datum_clockcult.dm index b8dfa00f23..6c8b83daa4 100644 --- a/code/datums/antagonists/datum_clockcult.dm +++ b/code/datums/antagonists/datum_clockcult.dm @@ -55,9 +55,8 @@ else if(isbrain(current) || isclockmob(current)) to_chat(current, "You can communicate with other servants by using the Hierophant Network action button in the upper left.") ..() - if(istype(SSticker.mode, /datum/game_mode/clockwork_cult)) - var/datum/game_mode/clockwork_cult/C = SSticker.mode - C.present_tasks(owner) //Memorize the objectives + to_chat(current, "This is Ratvar's will: [CLOCKCULT_OBJECTIVE]") + owner.memory += "Ratvar's will: [CLOCKCULT_OBJECTIVE]
" //Memorize the objectives /datum/antagonist/clockcult/apply_innate_effects(mob/living/mob_override) . = ..() diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 531cc873f0..132c834f10 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -171,14 +171,6 @@ Credit where due: return TRUE return FALSE -/datum/game_mode/clockwork_cult/proc/present_tasks(mob/living/L) //Memorizes and displays the clockwork cult's objective - if(!L || !istype(L) || !L.mind) - return 0 - var/datum/mind/M = L.mind - to_chat(M.current, "This is Ratvar's will: [CLOCKCULT_OBJECTIVE]") - M.memory += "Ratvar's will: [CLOCKCULT_OBJECTIVE]
" - return 1 - /datum/game_mode/clockwork_cult/proc/check_clockwork_victory() if(GLOB.clockwork_gateway_activated) SSticker.news_report = CLOCK_PROSELYTIZATION //failure, technically, but we have the station From 6cdf25ef490b7b33ac3963c5e1a4b3373edd2ce0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 May 2017 16:16:52 -0500 Subject: [PATCH 03/80] Adds a missing null check --- code/modules/shuttle/arrivals.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index a6888e3150..d60a832279 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -148,7 +148,8 @@ force_depart = FALSE . = ..() if(!. && !docked && !damaged) - console.say("Welcome to your new life, employees!") + if(console) + console.say("Welcome to your new life, employees!") for(var/L in queued_announces) var/datum/callback/C = L C.Invoke() From 0742aa525b22934ea2b3313f02fed39b71c4a014 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 May 2017 16:16:56 -0500 Subject: [PATCH 04/80] Fixes DBCore Recovery --- code/controllers/subsystem/dbcore.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index ad4691564c..cf3efc3bc3 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -23,7 +23,8 @@ SUBSYSTEM_DEF(dbcore) var/failed_connections = 0 /datum/controller/subsystem/dbcore/PreInit() - _db_con = _dm_db_new_con() + if(!_db_con) + _db_con = _dm_db_new_con() /datum/controller/subsystem/dbcore/Recover() _db_con = SSdbcore._db_con From 9033f9f0661d5f0b78bf58408a146e03f231b6ce Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 May 2017 16:19:03 -0500 Subject: [PATCH 05/80] Closes bold tag in bombing list secret --- code/modules/admin/secrets.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index eabc7d3fd0..e569eacd2b 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -174,7 +174,7 @@ if("list_bombers") if(!check_rights(R_ADMIN)) return - var/dat = "Bombing List
" + var/dat = "Bombing List
" for(var/l in GLOB.bombers) dat += text("[l]
") usr << browse(dat, "window=bombers") From 7d75b70ff07d890e64901531e46c20f8ef61cf8c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 May 2017 16:21:19 -0500 Subject: [PATCH 06/80] Renames a var --- .../clothing/glasses/engine_goggles.dm | 24 ++++--------- code/modules/clothing/glasses/glasses.dm | 36 ++++++++----------- 2 files changed, 22 insertions(+), 38 deletions(-) diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index 2f70c3bfdf..61cca9b24a 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -7,18 +7,18 @@ actions_types = list(/datum/action/item_action/toggle_mode) origin_tech = "materials=3;magnets=3;engineering=3;plasmatech=3" - mode = FALSE //FALSE - regular mesons mode TRUE - t-ray mode + mesons_on = TRUE //if set to FALSE, these goggles work as t-ray scanners. var/range = 1 /obj/item/clothing/glasses/meson/engine/toggle_mode(mob/user, voluntary) var/turf/T = get_turf(src) - if(T && T.z == ZLEVEL_MINING && mode) + if(T && T.z == ZLEVEL_MINING && !mesons_on) if(picked_excuse) to_chat(user, "Due to [picked_excuse], the [name] cannot currently be swapped to \[Meson] mode.") return - mode = !mode + mesons_on = !mesons_on - if(mode) + if(!mesons_on) vision_flags = 0 darkness_view = 2 invis_view = SEE_INVISIBLE_LIVING @@ -50,7 +50,7 @@ toggle_mode(user, TRUE) /obj/item/clothing/glasses/meson/engine/process() - if(!mode) + if(mesons_on) var/turf/T = get_turf(src) if(T && T.z == ZLEVEL_MINING) toggle_mode(loc) @@ -83,15 +83,8 @@ if(M.client) flick_overlay(I, list(M.client), 8) -/obj/item/clothing/glasses/meson/engine/proc/t_ray_on() - if(!ishuman(loc)) - return 0 - - var/mob/living/carbon/human/user = loc - return mode & (user.glasses == src) - /obj/item/clothing/glasses/meson/engine/update_icon() - icon_state = mode ? "trayson-tray" : "trayson-meson" + icon_state = mesons_on ? "trayson-meson" : "trayson-tray" if(istype(loc,/mob/living/carbon/human/)) var/mob/living/carbon/human/user = loc if(user.glasses == src) @@ -103,7 +96,7 @@ icon_state = "trayson-tray_off" origin_tech = "materials=3;magnets=2;engineering=2" - mode = TRUE + mesons_on = FALSE var/on = FALSE vision_flags = 0 darkness_view = 2 @@ -135,6 +128,3 @@ for(var/X in actions) var/datum/action/A = X A.UpdateButtonIcon() - -/obj/item/clothing/glasses/meson/engine/tray/t_ray_on() - return on && ..() diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 1cc0cc6163..063f3894c9 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -42,7 +42,7 @@ var/static/list/meson_mining_failure_excuses = list("seismic activity", "excessive lava", "ambient radiation", "electromagnetic storms", "bluespace disruption", \ "gravity", "dust", "dense rock", "ash", "badly understood science", "radiant heat") var/picked_excuse - var/mode = FALSE //if FALSE, is in normal meson mode. + var/mesons_on = TRUE /obj/item/clothing/glasses/meson/Initialize() . = ..() @@ -56,34 +56,28 @@ /obj/item/clothing/glasses/meson/examine(mob/user) ..() var/turf/T = get_turf(src) - if(T && T.z == ZLEVEL_MINING && mode && picked_excuse) + if(T && T.z == ZLEVEL_MINING && !mesons_on && picked_excuse) to_chat(user, "Due to [picked_excuse], these Meson Scanners will not be able to display terrain layouts in this area.") /obj/item/clothing/glasses/meson/proc/toggle_mode(mob/user) - if(vision_flags & SEE_TURFS) - mode = TRUE - vision_flags &= ~SEE_TURFS - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(picked_excuse) - to_chat(H, "Due to [picked_excuse], your Meson Scanners will not be able to display terrain layouts in this area.") - if(H.glasses == src) - H.update_sight() - else if(!(vision_flags & SEE_TURFS)) - mode = FALSE - vision_flags |= SEE_TURFS - if(ishuman(user)) - var/mob/living/carbon/human/H = user - to_chat(H, "Your Meson Scanners have reactivated.") - if(H.glasses == src) - H.update_sight() + vision_flags ^= SEE_TURFS + mesons_on = (vision_flags & SEE_TURFS)? TRUE : FALSE + + if(iscarbon(user)) //only carbons can wear glasses + var/mob/living/carbon/C = user + if(!mesons_on) + to_chat(C, "Your Meson Scanners have reactivated.") + else if(picked_excuse) + to_chat(C, "Due to [picked_excuse], your Meson Scanners will not be able to display terrain layouts in this area.") + if(C.glasses == src) + C.update_sight() /obj/item/clothing/glasses/meson/process() var/turf/T = get_turf(src) if(T && T.z == ZLEVEL_MINING) - if(!mode) + if(mesons_on) //if we're on mining, turn mesons OFF toggle_mode(loc) - else if(mode) + else if(!mesons_on) //otherwise, if we're not on mining, turn mesons back ON toggle_mode(loc) /obj/item/clothing/glasses/meson/night From 85d474885b0227229271a999cc9ebe3607f5f9c6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 May 2017 16:30:36 -0500 Subject: [PATCH 07/80] Brains extracted from infectious zombies keep their old species --- code/modules/mob/living/brain/brain_item.dm | 3 +++ code/modules/zombie/organs.dm | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index f137299581..aa9e133165 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -72,6 +72,9 @@ if(!brainmob.stored_dna) brainmob.stored_dna = new /datum/dna/stored(brainmob) C.dna.copy_dna(brainmob.stored_dna) + var/obj/item/organ/zombie_infection/ZI = L.getorganslot("zombie_infection") + if(ZI) + brainmob.set_species(ZI.old_species) //For if the brain is cloned if(L.mind && L.mind.current) L.mind.transfer_to(brainmob) to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a brain.") diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 3515da0dc6..c93699a2ac 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -70,8 +70,10 @@ var/stand_up = (owner.stat == DEAD) || (owner.stat == UNCONSCIOUS) + if(!owner.revive(full_heal = TRUE)) + return + owner.grab_ghost() - owner.revive(full_heal = TRUE) owner.visible_message("[owner] suddenly convulses, as [owner.p_they()][stand_up ? " stagger to [owner.p_their()] feet and" : ""] gain a ravenous hunger in [owner.p_their()] eyes!", "You HUNGER!") playsound(owner.loc, 'sound/hallucinations/far_noise.ogg', 50, 1) owner.do_jitter_animation(living_transformation_time * 10) From b86db49d5009d0fe87542a59c28e11b638a8aaa2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 May 2017 18:28:52 -0500 Subject: [PATCH 08/80] Crushers now actually mark --- code/datums/status_effects/debuffs.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index f24ad5f7c3..92ee2e6462 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -181,6 +181,7 @@ marked_underlay.pixel_x = -owner.pixel_x marked_underlay.pixel_y = -owner.pixel_y owner.underlays += marked_underlay + return TRUE return FALSE /datum/status_effect/crusher_mark/Destroy() From 1cfd18a757f33ef2933a95e0db63970631147c5f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 24 May 2017 18:28:56 -0500 Subject: [PATCH 09/80] Fixes SSlighting Recovery --- code/controllers/subsystem/lighting.dm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index 35d8a3d08f..bcb94c835b 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -15,14 +15,15 @@ SUBSYSTEM_DEF(lighting) /datum/controller/subsystem/lighting/Initialize(timeofday) - if (config.starlight) - for(var/I in GLOB.sortedAreas) - var/area/A = I - if (A.dynamic_lighting == DYNAMIC_LIGHTING_IFSTARLIGHT) - A.luminosity = 0 + if(!initialized) + if (config.starlight) + for(var/I in GLOB.sortedAreas) + var/area/A = I + if (A.dynamic_lighting == DYNAMIC_LIGHTING_IFSTARLIGHT) + A.luminosity = 0 - create_all_lighting_objects() - initialized = TRUE + create_all_lighting_objects() + initialized = TRUE fire(FALSE, TRUE) From 36c14b3e71c5fc03fe7575cbdcbf88cf8d4d32ae Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 25 May 2017 07:29:47 -0500 Subject: [PATCH 10/80] fixes AOE projectile automatic proximity detonation --- code/modules/projectiles/projectile/magic.dm | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 5cd94748e4..05bdd7da3f 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -351,21 +351,9 @@ /obj/item/projectile/magic/aoe/Range() if(proxdet) - var/turf/T1 = get_step(src,turn(dir, -45)) - var/turf/T2 = get_step(src,turn(dir, 45)) - var/turf/T3 = get_step(src,dir) - var/mob/living/L = locate(/mob/living) in T1 //if there's a mob alive in our front right diagonal, we hit it. - if(L && L.stat != DEAD) - Bump(L,1) //Magic Bullet #teachthecontroversy - return - L = locate(/mob/living) in T2 - if(L && L.stat != DEAD) - Bump(L,1) - return - L = locate(/mob/living) in T3 - if(L && L.stat != DEAD) - Bump(L,1) - return + for(var/mob/living/L in range(1, get_turf(src))) + if(L.stat != DEAD && L != firer) + return Bump(L, TRUE) ..() /obj/item/projectile/magic/aoe/lightning From 350817340385f85f8e6705385fe9ed62c2d114c8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 25 May 2017 08:36:59 -0500 Subject: [PATCH 11/80] Removes the shadowshroom admin message --- code/modules/hydroponics/grown/mushrooms.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index 61eb397b92..fc34fbad83 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -306,6 +306,5 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom/attack_self(mob/user) . = ..() if(.) - message_admins("Shadowshroom planted by [ADMIN_LOOKUPFLW(user)] at [ADMIN_COORDJMP(user)]",0,1) investigate_log("was planted by [key_name(user)] at [COORD(user)]", INVESTIGATE_BOTANY) From e4fc93678936fa5e467cd41324e4728adb43d037 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 25 May 2017 08:38:05 -0500 Subject: [PATCH 12/80] INDESTRUCTIBLE objects are no longer affected by explosions --- code/game/objects/obj_defense.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 702e72842f..44281fb26f 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -48,6 +48,8 @@ take_damage(tforce, BRUTE, "melee", 1, get_dir(src, AM)) /obj/ex_act(severity, target) + if(resistance_flags & INDESTRUCTIBLE) + return ..() //contents explosion if(target == src) qdel(src) @@ -256,4 +258,4 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e if(can_break && integrity_failure && current_integrity <= integrity_failure) obj_break(damage_type) return TRUE - return FALSE \ No newline at end of file + return FALSE From 7998cdcd9a8f89c329c75b5dcdeb2b5838dfdb15 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 25 May 2017 08:45:28 -0500 Subject: [PATCH 13/80] Gang Icons and Fixes --- .../machinery/porta_turret/portable_turret.dm | 32 ++++++++++++------ icons/obj/guns/projectile.dmi | Bin 31624 -> 31842 bytes 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 22c6c57b17..6fa58e5ba2 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -227,7 +227,6 @@ update_icon() - /obj/machinery/porta_turret/attackby(obj/item/I, mob/user, params) if(stat & BROKEN) if(istype(I, /obj/item/weapon/crowbar)) @@ -947,6 +946,7 @@ var/atom/target var/turf/target_turf var/warned = FALSE + var/mouseparams //BUCKLE HOOKS @@ -990,8 +990,8 @@ icon = 'icons/obj/weapons.dmi' icon_state = "offhand" w_class = WEIGHT_CLASS_HUGE - flags = ABSTRACT | NODROP - resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | NOBLUDGEON + flags = ABSTRACT | NODROP | NOBLUDGEON + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF var/obj/machinery/manned_turret/turret /obj/item/gun_control/New(obj/machinery/manned_turret/MT) @@ -1003,11 +1003,22 @@ /obj/item/gun_control/CanItemAutoclick() return 1 -/obj/item/gun_control/afterattack(atom/targeted_atom, mob/user) +/obj/item/gun_control/attack_obj(obj/O, mob/living/user) + user.changeNext_move(CLICK_CD_MELEE) + O.attacked_by(src, user) + +/obj/item/gun_control/attack(mob/living/M, mob/living/user) + user.lastattacked = M + M.lastattacker = user + M.attacked_by(src, user) + add_fingerprint(user) + +/obj/item/gun_control/afterattack(atom/targeted_atom, mob/user, flag, params) ..() var/obj/machinery/manned_turret/E = user.buckled E.setDir(get_dir(E,targeted_atom)) user.setDir(E.dir) + E.mouseparams = params switch(E.dir) if(NORTH) E.layer = BELOW_MOB_LAYER @@ -1055,15 +1066,15 @@ else cooldown = world.time + cooldown_duration warned = FALSE - INVOKE_ASYNC(src, /obj/machinery/manned_turret/.proc/volley) + volley(user) -/obj/machinery/manned_turret/proc/volley() +/obj/machinery/manned_turret/proc/volley(mob/user) target_turf = get_turf(target) for(var/i in 1 to number_of_shots) - addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper), i*rate_of_fire) + addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper, user), i*rate_of_fire) -/obj/machinery/manned_turret/proc/fire_helper() +/obj/machinery/manned_turret/proc/fire_helper(mob/user) if(!src) return var/turf/targets_from = get_turf(src) @@ -1072,11 +1083,10 @@ var/obj/item/projectile/P = new projectile_type(targets_from) P.current = targets_from P.starting = targets_from - P.firer = src + P.firer = user P.original = target playsound(src, 'sound/weapons/Gunshot_smg.ogg', 75, 1) - P.yo = target.y - targets_from.y + rand(-1,1) - P.xo = target.x - targets_from.x + rand(-1,1) + P.preparePixelProjectile(target, target_turf, user, mouseparams, rand(-9, 9)) P.fire() /obj/machinery/manned_turret/ultimate // Admin-only proof of concept for autoclicker automatics diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 611a27e6a70ddfa3a1c6d21b4037e002953a6625..7cb9f2a3ff850efb26d82416b0aa04f60c0a4163 100644 GIT binary patch delta 11430 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 From 798d5fbff218806981ce85f07659f9f5dfaaaae0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 25 May 2017 09:30:29 -0500 Subject: [PATCH 14/80] Automatic changelog generation for PR #1178 [ci skip] --- html/changelogs/AutoChangeLog-pr-1178.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1178.yml diff --git a/html/changelogs/AutoChangeLog-pr-1178.yml b/html/changelogs/AutoChangeLog-pr-1178.yml new file mode 100644 index 0000000000..2fdc37039e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1178.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Indestructible objects can no longer be destroyed by bombs" From b74a15c9eac2953ffd61f509ac9fbcd7dfc2ac15 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 25 May 2017 09:37:26 -0500 Subject: [PATCH 15/80] Automatic changelog generation for PR #1171 [ci skip] --- html/changelogs/AutoChangeLog-pr-1171.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1171.yml diff --git a/html/changelogs/AutoChangeLog-pr-1171.yml b/html/changelogs/AutoChangeLog-pr-1171.yml new file mode 100644 index 0000000000..e0c0601fd6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1171.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "crushers now apply marks properly" From 2bfcc9bf1eb1c41aa22c46bbeefccabecf269804 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 25 May 2017 09:43:34 -0500 Subject: [PATCH 16/80] [s] Fixes hiding the nuke disk on the arrivals shuttle --- code/modules/shuttle/arrivals.dm | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index d60a832279..7cb347d429 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -99,7 +99,7 @@ SendToStation() return - var/found_awake = PersonCheck() + var/found_awake = PersonCheck() || NukeDiskCheck() if(mode == SHUTTLE_CALL) if(found_awake) SendToStation() @@ -128,6 +128,12 @@ return TRUE return FALSE +/obj/docking_port/mobile/arrivals/proc/NukeDiskCheck() + for (var/obj/item/weapon/disk/nuclear/N in GLOB.poi_list) + if (get_area(N) in areas) + return TRUE + return FALSE + /obj/docking_port/mobile/arrivals/proc/SendToStation() var/dockTime = config.arrivals_shuttle_dock_window if(mode == SHUTTLE_CALL && timeLeft(1) > dockTime) @@ -140,11 +146,17 @@ var/docked = S1 == assigned_transit sound_played = FALSE if(docked) //about to launch - if(!force_depart && PersonCheck()) - mode = SHUTTLE_IDLE - if(console) - console.say("Launch cancelled, lifeform dectected on board.") - return + if(!force_depart) + var/cancel_reason + if(PersonCheck()) + cancel_reason = "lifeform dectected on board" + else if(NukeDiskCheck()) + cancel_reason = "critical station device detected on board" + if(cancel_reason) + mode = SHUTTLE_IDLE + if(console) + console.say("Launch cancelled, [cancel_reason].") + return force_depart = FALSE . = ..() if(!. && !docked && !damaged) From e2b1ef2ad2e5ba1650f6a61852953947bb873e72 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 25 May 2017 09:44:40 -0500 Subject: [PATCH 17/80] Xenobio console origin tech fix --- code/game/machinery/computer/buildandrepair.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 600ededadd..f9014d5b8f 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -178,7 +178,7 @@ /obj/item/weapon/circuitboard/computer/xenobiology name = "circuit board (Xenobiology Console)" build_path = /obj/machinery/computer/camera_advanced/xenobio - origin_tech = "programming=3;bio=3" + origin_tech = "programming=3;biotech=3" /obj/item/weapon/circuitboard/computer/base_construction name = "circuit board (Aux Mining Base Construction Console)" build_path = /obj/machinery/computer/camera_advanced/base_construction From 1cf1c1cb4c1c730d4ad7a57d0ab1696f4c5b7bb9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 25 May 2017 09:52:53 -0500 Subject: [PATCH 18/80] Roughly one fifth of internal affairs agents are traitors with an extra objective --- code/game/gamemodes/traitor/double_agents.dm | 35 ++++-- code/game/gamemodes/traitor/traitor.dm | 106 ++++++++++--------- 2 files changed, 83 insertions(+), 58 deletions(-) diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm index 2ee546c7aa..dfe198eeb9 100644 --- a/code/game/gamemodes/traitor/double_agents.dm +++ b/code/game/gamemodes/traitor/double_agents.dm @@ -1,6 +1,8 @@ #define PINPOINTER_MINIMUM_RANGE 15 #define PINPOINTER_EXTRA_RANDOM_RANGE 10 #define PINPOINTER_PING_TIME 40 +#define PROB_ACTUAL_TRAITOR 20 +#define TRAITOR_AGENT_ROLE "Syndicate External Affairs Agent" /datum/game_mode/traitor/internal_affairs name = "Internal Affairs" @@ -171,7 +173,10 @@ if(!objective.check_completion()) traitored = FALSE return - to_chat(owner.current," All the other agents are dead, and you're the last loose end. Stage a Syndicate terrorist attack to cover up for today's events. You no longer have any limits on collateral damage.") + if(owner.special_role == TRAITOR_AGENT_ROLE) + to_chat(owner.current," All the loyalist agents are dead, and no more is required of you. Die a glorious death, agent. ") + else + to_chat(owner.current," All the other agents are dead, and you're the last loose end. Stage a Syndicate terrorist attack to cover up for today's events. You no longer have any limits on collateral damage.") replace_escape_objective(owner) @@ -194,7 +199,10 @@ if(objective.stolen) var/fail_msg = "Your sensors tell you that [objective.target.current.real_name], one of the targets you were meant to have killed, pulled one over on you, and is still alive - do the job properly this time! " if(traitored) - fail_msg += " The truth could still slip out! Cease any terrorist actions as soon as possible, unneeded property damage or loss of employee life will lead to your contract being terminated." + if(owner.special_role == TRAITOR_AGENT_ROLE) + fail_msg += " You no longer have permission to die. " + else + fail_msg += " The truth could still slip out! Cease any terrorist actions as soon as possible, unneeded property damage or loss of employee life will lead to your contract being terminated." reinstate_escape_objective(owner) traitored = FALSE to_chat(owner.current, fail_msg) @@ -238,6 +246,10 @@ state.add_steal_targets_timer() if(!issilicon(traitor.current)) give_pinpointer(traitor) + //Optional traitor objective + if(prob(PROB_ACTUAL_TRAITOR)) + traitor.special_role = TRAITOR_AGENT_ROLE + forge_single_objective(traitor) else ..() // Give them standard objectives. @@ -289,11 +301,18 @@ /datum/game_mode/traitor/internal_affairs/greet_traitor(datum/mind/traitor) var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "recieving bribes", "malpractice", "worship of prohbited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence") - to_chat(traitor.current, "You are the [traitor_name].") - to_chat(traitor.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.") - to_chat(traitor.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.") - to_chat(traitor.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.") - to_chat(traitor.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.") + if(traitor.special_role == TRAITOR_AGENT_ROLE) + to_chat(traitor.current, "You are the [TRAITOR_AGENT_ROLE].") + to_chat(traitor.current, "Your target has been framed for [crime], and you have been tasked with eliminating them to prevent them defending themselves in court.") + to_chat(traitor.current, "Any damage you cause will be a further embarrassment to Nanotrasen, so you have no limits on collateral damage.") + to_chat(traitor.current, " You have been provided with a standard uplink to accomplish your task. ") + to_chat(traitor.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.") + else + to_chat(traitor.current, "You are the [traitor_name].") + to_chat(traitor.current, "Your target is suspected of [crime], and you have been tasked with eliminating them by any means necessary to avoid a costly and embarrassing public trial.") + to_chat(traitor.current, "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.") + to_chat(traitor.current, "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink.") + to_chat(traitor.current, "Finally, watch your back. Your target has friends in high places, and intel suggests someone may have taken out a contract of their own to protect them.") traitor.announce_objectives() @@ -301,6 +320,8 @@ /datum/game_mode/traitor/internal_affairs/give_codewords(mob/living/traitor_mob) return +#undef PROB_ACTUAL_TRAITOR #undef PINPOINTER_EXTRA_RANDOM_RANGE #undef PINPOINTER_MINIMUM_RANGE #undef PINPOINTER_PING_TIME + diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 4673b572a8..6ad37815ca 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -85,40 +85,65 @@ character.make_Traitor() +/datum/game_mode/proc/forge_single_objective(datum/mind/traitor) //Returns how many objectives are added + .=1 + if(issilicon(traitor.current)) + var/special_pick = rand(1,4) + switch(special_pick) + if(1) + var/datum/objective/block/block_objective = new + block_objective.owner = traitor + traitor.objectives += block_objective + if(2) + var/datum/objective/purge/purge_objective = new + purge_objective.owner = traitor + traitor.objectives += purge_objective + if(3) + var/datum/objective/robot_army/robot_objective = new + robot_objective.owner = traitor + traitor.objectives += robot_objective + if(4) //Protect and strand a target + var/datum/objective/protect/yandere_one = new + yandere_one.owner = traitor + traitor.objectives += yandere_one + yandere_one.find_target() + var/datum/objective/maroon/yandere_two = new + yandere_two.owner = traitor + yandere_two.target = yandere_one.target + yandere_two.update_explanation_text() // normally called in find_target() + traitor.objectives += yandere_two + .=2 + else + if(prob(50)) + var/list/active_ais = active_ais() + if(active_ais.len && prob(100/GLOB.joined_player_list.len)) + var/datum/objective/destroy/destroy_objective = new + destroy_objective.owner = traitor + destroy_objective.find_target() + traitor.objectives += destroy_objective + else if(prob(30)) + var/datum/objective/maroon/maroon_objective = new + maroon_objective.owner = traitor + maroon_objective.find_target() + traitor.objectives += maroon_objective + else + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = traitor + kill_objective.find_target() + traitor.objectives += kill_objective + else + var/datum/objective/steal/steal_objective = new + steal_objective.owner = traitor + steal_objective.find_target() + traitor.objectives += steal_objective + + /datum/game_mode/proc/forge_traitor_objectives(datum/mind/traitor) if(issilicon(traitor.current)) var/objective_count = 0 if(prob(30)) - var/special_pick = rand(1,4) - switch(special_pick) - if(1) - var/datum/objective/block/block_objective = new - block_objective.owner = traitor - traitor.objectives += block_objective - objective_count++ - if(2) - var/datum/objective/purge/purge_objective = new - purge_objective.owner = traitor - traitor.objectives += purge_objective - objective_count++ - if(3) - var/datum/objective/robot_army/robot_objective = new - robot_objective.owner = traitor - traitor.objectives += robot_objective - objective_count++ - if(4) //Protect and strand a target - var/datum/objective/protect/yandere_one = new - yandere_one.owner = traitor - traitor.objectives += yandere_one - yandere_one.find_target() - objective_count++ - var/datum/objective/maroon/yandere_two = new - yandere_two.owner = traitor - yandere_two.target = yandere_one.target - yandere_two.update_explanation_text() // normally called in find_target() - traitor.objectives += yandere_two - objective_count++ + objective_count+=forge_single_objective(traitor) for(var/i = objective_count, i < config.traitor_objectives_amount, i++) var/datum/objective/assassinate/kill_objective = new @@ -142,29 +167,8 @@ assign_exchange_role(exchange_red) assign_exchange_role(exchange_blue) objective_count += 1 //Exchange counts towards number of objectives - var/list/active_ais = active_ais() for(var/i = objective_count, i < config.traitor_objectives_amount, i++) - if(prob(50)) - if(active_ais.len && prob(100/GLOB.joined_player_list.len)) - var/datum/objective/destroy/destroy_objective = new - destroy_objective.owner = traitor - destroy_objective.find_target() - traitor.objectives += destroy_objective - else if(prob(30)) - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = traitor - maroon_objective.find_target() - traitor.objectives += maroon_objective - else - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = traitor - kill_objective.find_target() - traitor.objectives += kill_objective - else - var/datum/objective/steal/steal_objective = new - steal_objective.owner = traitor - steal_objective.find_target() - traitor.objectives += steal_objective + forge_single_objective(traitor) if(is_hijacker && objective_count <= config.traitor_objectives_amount) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount if (!(locate(/datum/objective/hijack) in traitor.objectives)) From 3c60a6c82f1f2d3bec178701f8811a9c8ea59fc5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 25 May 2017 10:37:50 -0500 Subject: [PATCH 19/80] Aux base plasma turrets now have range equal to the range they fire in --- code/modules/projectiles/projectile/special.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 57b339178f..867d1b8c8f 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -242,6 +242,7 @@ //Between normal and advanced for damage, made a beam so not the turret does not destroy glass name = "plasma beam" damage = 6 + range = 7 pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE From fa4e0e61d6efd55f9404611127bee89259d8c898 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 09:05:52 -0500 Subject: [PATCH 20/80] Fixes adv camera leaving obscured images --- code/game/gamemodes/miniantags/abduction/machinery/camera.dm | 2 +- code/game/machinery/computer/camera_advanced.dm | 2 +- code/modules/research/xenobiology/xenobio_camera.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm index 1e725bccba..554d992987 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm @@ -70,12 +70,12 @@ origin.vest_mode_action.Remove(C) origin.vest_disguise_action.Remove(C) origin.set_droppoint_action.Remove(C) - remote_eye.eye_user = null C.reset_perspective(null) if(C.client) C.client.images -= remote_eye.user_image for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks) chunk.remove(remote_eye) + remote_eye.eye_user = null C.remote_control = null C.unset_machine() Remove(C) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index e3637d3430..1719695cf5 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -151,13 +151,13 @@ obj/machinery/computer/camera_advanced/attack_ai(mob/user) var/mob/camera/aiEye/remote/remote_eye = C.remote_control remote_eye.origin.current_user = null remote_eye.origin.jump_action.Remove(C) - remote_eye.eye_user = null if(C.client) C.reset_perspective(null) if(remote_eye.visible_icon) C.client.images -= remote_eye.user_image for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks) chunk.remove(remote_eye) + remote_eye.eye_user = null C.remote_control = null C.unset_machine() Remove(C) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index ff7c3f6340..f43a89eef4 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -96,12 +96,12 @@ origin.feed_slime_action.Remove(C) origin.monkey_recycle_action.Remove(C) //All of this stuff below could probably be a proc for all advanced cameras, only the action removal needs to be camera specific - remote_eye.eye_user = null C.reset_perspective(null) if(C.client) C.client.images -= remote_eye.user_image for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks) chunk.remove(remote_eye) + remote_eye.eye_user = null C.remote_control = null C.unset_machine() Remove(C) From 4cc3f81b3e12584f99630589a3b0d61eb0601dc5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 11:12:09 -0500 Subject: [PATCH 21/80] Moves attack chain proc from global to obj/item --- code/_onclick/click.dm | 4 ++-- code/_onclick/cyborg.dm | 4 ++-- code/_onclick/item_attack.dm | 10 +++++----- code/_onclick/telekinesis.dm | 3 ++- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index a8e2681dc9..5b26067725 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -119,7 +119,7 @@ //User itself, current loc, and user inventory if(DirectAccess(A)) if(W) - melee_item_attack_chain(src,W,A,params) + W.melee_attack_chain(src, A, params) else if(ismob(A)) changeNext_move(CLICK_CD_MELEE) @@ -133,7 +133,7 @@ //Standard reach turf to turf or reaching inside storage if(CanReach(A,W)) if(W) - melee_item_attack_chain(src,W,A,params) + W.melee_attack_chain(src, A, params) else if(ismob(A)) changeNext_move(CLICK_CD_MELEE) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index c52b3441db..3bb15c1947 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -71,7 +71,7 @@ // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents) if(A == loc || (A in loc) || (A in contents)) - melee_item_attack_chain(src, W, A, params) + W.melee_attack_chain(src, A, params) return if(!isturf(loc)) @@ -80,7 +80,7 @@ // cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc)) if(isturf(A) || isturf(A.loc)) if(A.Adjacent(src)) // see adjacent.dm - melee_item_attack_chain(src, W, A, params) + W.melee_attack_chain(src, A, params) return else W.afterattack(A, src, 0, params) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 24f6559dd6..72694a434c 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -1,10 +1,10 @@ -/proc/melee_item_attack_chain(mob/user, obj/item/I, atom/target, params) - if(I.pre_attackby(target, user, params)) +/obj/item/proc/melee_attack_chain(mob/user, atom/target, params) + if(pre_attackby(target, user, params)) // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) - var/resolved = target.attackby(I,user,params) - if(!resolved && target && I) - I.afterattack(target, user, 1, params) // 1: clicking something Adjacent + var/resolved = target.attackby(src, user, params) + if(!resolved && target && !QDELETED(src)) + afterattack(target, user, 1, params) // 1: clicking something Adjacent // Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index c7ad66440e..0ca0fb31a9 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -124,7 +124,8 @@ if(!isturf(target) && istype(focus,/obj/item) && target.Adjacent(focus)) apply_focus_overlay() - melee_item_attack_chain(tk_user, focus, target, params) //isn't copying the attack chain fun. we should do it more often. + var/obj/item/I = focus + I.melee_attack_chain(tk_user, target, params) //isn't copying the attack chain fun. we should do it more often. if(check_if_focusable(focus)) focus.do_attack_animation(target, null, focus) else From 11c74ee6b44afd6d50f6c2137533262f8dcbd6b8 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 11:13:15 -0500 Subject: [PATCH 22/80] Adds cycling delay to PKborg dampeners, fixes dampener projectors leaving fields behind when server is lagging --- code/game/objects/items/robot/robot_items.dm | 27 ++++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 97a343311d..5bca9cf535 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -504,6 +504,8 @@ S.change_head_color(color2) dropped = TRUE +#define PKBORG_DAMPEN_CYCLE_DELAY 20 + //Peacekeeper Cyborg Projectile Dampenening Field /obj/item/borg/projectile_dampen name = "Hyperkinetic Dampening projector" @@ -526,6 +528,7 @@ var/image/projectile_effect var/field_radius = 3 var/active = FALSE + var/cycle_delay = 0 /obj/item/borg/projectile_dampen/debug maxenergy = 50000 @@ -545,29 +548,31 @@ return ..() /obj/item/borg/projectile_dampen/attack_self(mob/user) - if(!istype(dampening_field)) - activate_field() - active = TRUE + if(cycle_delay < world.time) + to_chat(user, "\the [src] is still recycling its projectors!") + return + cycle_delay = world.time + PKBORG_DAMPEN_CYCLE_DELAY + active = !active + if(active) + activate_field(user) else deactivate_field() - active = FALSE + update_icon() to_chat(user, "You [active? "activate":"deactivate"] the [src].") /obj/item/borg/projectile_dampen/update_icon() - . = ..() icon_state = "[initial(icon_state)][active]" /obj/item/borg/projectile_dampen/proc/activate_field() - if(!istype(dampening_field)) - dampening_field = make_field(/datum/proximity_monitor/advanced/peaceborg_dampener, list("current_range" = field_radius, "host" = src, "projector" = src)) - update_icon() + if(istype(dampening_field)) + QDEL_NULL(dampening_field) + dampening_field = make_field(/datum/proximity_monitor/advanced/peaceborg_dampener, list("current_range" = field_radius, "host" = src, "projector" = src)) /obj/item/borg/projectile_dampen/proc/deactivate_field() QDEL_NULL(dampening_field) - visible_message("The [src] shuts off!") - for(var/obj/item/projectile/P in tracked) + visible_message("\The [src] shuts off!") + for(var/P in tracked) restore_projectile(P) - update_icon() /obj/item/borg/projectile_dampen/dropped() . = ..() From a84bcdd42ea6abecdb182f69c27fe525a02611c1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 11:14:20 -0500 Subject: [PATCH 23/80] Adds goliath cloak & a recipe (Lavaland PvE primitive item) --- code/modules/clothing/suits/cloaks.dm | 18 +++++++++++++++++- code/modules/crafting/recipes.dm | 13 +++++++++++-- icons/obj/clothing/suits.dmi | Bin 105013 -> 105553 bytes 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index 1a8c96e802..e90c750d12 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -50,12 +50,28 @@ name = "captain's cloak" desc = "Worn by the commander of Space Station 13." icon_state = "capcloak" - + /obj/item/clothing/neck/cloak/hop name = "head of personnel's cloak" desc = "Worn by the Head of Personnel. It smells faintly of bureaucracy." icon_state = "hopcloak" +/obj/item/clothing/suit/hooded/cloak/goliath + name = "goliath cloak" + icon_state = "goliath_cloak" + desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits." + allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/pickaxe, /obj/item/weapon/twohanded/spear, /obj/item/weapon/twohanded/bonespear, /obj/item/organ/hivelord_core/legion, /obj/item/weapon/kitchen/knife/combat/bone, /obj/item/weapon/kitchen/knife/combat/survival) + armor = list(melee = 35, bullet = 10, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 60, acid = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot + hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath + body_parts_covered = CHEST|GROIN|ARMS + +/obj/item/clothing/head/hooded/cloakhood/goliath + name = "goliath cloak hood" + icon_state = "golhood" + desc = "A protective & concealing hood." + armor = list(melee = 35, bullet = 10, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 60, acid = 60) + flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR + /obj/item/clothing/suit/hooded/cloak/drake name = "drake armour" icon_state = "dragon" diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 72088961de..a489d0fb6a 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -337,9 +337,9 @@ /obj/item/weapon/restraints/handcuffs/cable = 1 ) category = CAT_MISC - + /datum/crafting_recipe/toysword - name = "Toy Sword" + name = "Toy Sword" reqs = list(/obj/item/weapon/light/bulb = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4) result = /obj/item/toy/sword category = CAT_MISC @@ -398,6 +398,15 @@ reqs = list(/obj/item/stack/sheet/bone = 4) category = CAT_PRIMAL +/datum/crafting_recipe/goliathcloak + name = "Goliath Cloak" + result = /obj/item/clothing/suit/hooded/cloak/goliath + time = 50 + reqs = list(/obj/item/stack/sheet/leather = 2, + /obj/item/stack/sheet/sinew = 2, + /obj/item/stack/sheet/animalhide/goliath_hide = 2) //it takes 4 goliaths to make 1 cloak if the plates are skinned + category = CAT_PRIMAL + /datum/crafting_recipe/drakecloak name = "Ash Drake Armour" result = /obj/item/clothing/suit/hooded/cloak/drake diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 27e02e2e7ccf4c80558ae376ae0aef362fb7a2fb..3a59c48c2e194df8a74f430b0b43c56f84ebfe5e 100644 GIT binary patch delta 10752 zcmYLvbzBtP_x~3t`AGZ7B5VP3r!epZ^;z7?aU_(W8A<@2cLUCk$}3&pV29Vlf_Og=u~R-J zX1{%?bgQz-CY{cB;;rqSH|DIJd$PLlSpO z;QFUyDcY-TWc`)%K-22C>(CHTsL-M~`I2$ z*!uuvUqbFqVXy7W*@jo9P!k^QY$aP;j`j6*&=soT)woRO@Y5G&8r->=nN$3Ct9xy~ z+txadU8(b76gVNi$M~dVhFvpVqipZ?p?>BZq9p85RoVg%9{4#hQ&ElSUP?(z8=09^ zoZtPCy~qv>D$?-kRe-%h&JRk;%ZaD=PI3Una!o0BRl(=$iTicOYP~tA&WrT?bsb^R zOL&pacBD)_1n+e|VR;5`%iz~7H?Gt4($Z2E4dln6jrzc}PvSHl+0lbDDu#w!tiT13 zz#xtHBL2hIDh!K*11kG1-i+zR3OXl$b2-X$Y89 z2j^!WJ^d41Ou5!1I>cTyVKK>i1I9NZCMLE;Rc?|QU`7mkaEgc| z@9nwq=;ThkVqV%FFPqDww~;VE?F@h>R?B{mqt6X>e_SY#pg{im?>^k*fq=km3JQeN zG#MG$^nQTVZ6YEfyXH9*W004Z=rXXpY;0n3Hj6&+ymYcXT<9d-QcMA(iFPz07IX}w zfK6F82trxFP_?;;NI$$>3;hM0s8-aG_&X}D<)}x?eZf#zM(%9j|^$4eKkcSsbXU`fb{V{eYl&Z z$*@BY9X%TA>n|k))+YzDQSX`wu;8e78eVJtRE~=`H1ha`V?9wCI|yZE$KUM2@|Sw1 z3Ar(kMMblxOv(@l=2#~t8~wYTPWd3HrJ@Ym-zAm*yiaKM9)%~p67#$fUCGCS^Ip_kRvAt$J>Dc zO>G_;;jG&06tvJH&1Tc3=GYd&=kjv&^21$3_2H;ztzJTM8pS7b zq+mB<4c8Y~`{EacNH+P7qGk6*4#KcB(b5lJHw2R`jnG$YzXj}Kq>&qnm893?66fJI zHf+LKgS%4WDJhiq$cY^5XGA#*XT3d+jdyl~6{(J!Lp^C(gdTQY{6S{6WA>*aMr~wi zekLvTW@Q?^ZYclxinu*2(ozy_UUZ+>-qnpwQ0}cf`6jZ&w7 z*D`0+2Ej#hui|Qa=g;ZR%MZF{V0?}dd2oufoZiwMa)7*V*{hI`q@<*zxVV@ts>@Ak z9G9>@e7L+3f>(=iaT{TUM$a}vGDXxc6}5D!%#E?s=k;ZStj2*rX_gEpIoQS7nT?Ap zs;f)MO^R8CxY`w+ABR2N9`95j-HJ9EBi!VA^IGQ^3qDu=3kPP}v1*m$XnY zyyPty*t_{?UDg?gbOj-1O+|L$jFFJ=w_bXn=>~+RKe^nZPS4r)e5AePuvkH$=+ho-W}Ys)^6N2 zD}(NR09k=_46O}%de~=N^DO~i3Jd7A%n;+^ppIom6e|NmxyTbqDXE><3NCsU`Kze` z-S9FlG6uc|Gi;BRF99YV5gnhYia2YqhEbRN%ElKoXU4Bo`^q!dSy;o=ck{g_CC+pX|=9#}+nuI%fx?FSVq zYk)(jDJe(4p53v66(1Htui>XvZ5sfwq`ueDP-5Or)42*RA$)0VZJjqPA95T|)NwBb z6pU_ZC4Bk0n4P)FI)TQ1lyd)b7v3EFg&{>o9V-TRxoYHK6V*@F^17|;aLJz(7HG&i z_u(rbZ)Izj3O6Hy+LpuKz}K~|$RRAmn}hgUan>VOn?*N` zGHFIVt$ko(c488eKN;;!m}>s;eL0fE%uKqsZ{H5LsE!%|#?ozC@)B&Sp|K+}CHych7IdZ$O+&G3c)_ z3%7_k{BF6oyzTw;>0b4r`j+WoP{Q#$OmpFqtBk2o+i27N3MfdQXpPiCt%Dzbp&gTE&w5 z;*%##cwryzc#NqJikb!(4yl&P7gS(Wc!b2&PMK3c5sgJ8`)w^P*)#P{^^QZi@#f(W zWv#H;yZQU-8cNp|ur)}GIR91>%8K8oVol_p@FV;sNaEFOFfRDgGIKsd@HcfXuPnkL zOGm(RxAm@k^QP5rBsX=eDo5&5uFagT2oMzm<*3k;YTmH_^`3gSeVHynWL;i!$2R#xb0gdk!XUx1vCj*uT>VK64NU`!zW)v^EY;?7 z5)&QO&ke%0TTS`p&up>)#Um%zEX(QXrn6n-wY){U>Yr3`9*V^p4=B6zcq=R!7gtls7EQ`tqH~zDz^2enEnq+0dsPjq9Qjm_b)Y3SYt*Jb zm4S5x_9Uhi0FLoD?`5xeUQ);Mnwgn#@blk}z+pr8{JDom6^KtjV0GzxWc1%a2pT1j zDlQmf_lkn*CG{io`p1{&3A$*)n=R3e2o)wvlE`>gr_IznOJuwjY1?`CtuEAtiPR%J z(8sKEG8*^&PemiGCs%QIIfUdB(^jZ`gc*sHbe?a10lp{G0fW%yzbp0F%bieE&DWNW zrbS&(e^?jweWAUB^bwtac44hKFr}@O9TbY%KeW2}eMSODeF)HaYXLR+27b{1=uBS4 zZ%99S_|UMYuP>mox}u^823sftHYs?lKkK>$hE6`yec^7k+;|f0@7fzD=}EQp*8FS6 zlp}8~kUI7|Up8yU6TS`&MASCc=z#TxSwyPf2TX?Qq)tN?o(4t`EhR6?F}gcYo)(8Q z%S}|h2g$)f;f)Yh``ha+_S(bFa}eLRuj9M*Up|8vf>sm%A}>}I+HYf!6P~^GADO^4 zh^9P$N@{t^h>&Ws%|&{}9r4Q%Au~bb$s!n7n%Hh~Uc-p(m@NkdDK6(P%B_oEVlX%L zb#*=E24Bjnst$_RBv;vlg_AsCmwlA@N=6u7S6#eOpI;}&7-p@$i-!D9uHS1+osg))8*E=QxDb>*h%9o2z``tSGNsx-8Lp#-i}{ zC1>5m$+%YU;2=gY{G2;JLE1AJ=%P)nNPKH=}>Xs0KRGj{15S zQ(*8sx-?W>LrqNPf#wUDnFHijIp105Ig0>Ga6hlGsLrJZidD@RYtZ(GB9^5bA>Uq+ z3YSA!6!as~fly2n;_Nw`#J^&2rW%DH8oWY z4Z8`$u3=7D{;$GczO^N61LIO#D4aj*PWpA{AAzzJ+#?qPaX4C7sER2c0DeT>pEKI^m(HSDSB zn1+X|VWnOO57>g)dr^K;-Dm8gq7ke*SoZ2_)0bOelq^h@fB-~419o;K7!wnHwT9W{ zgSWAn0G}u>dq!w`AQUqm>+mbGi&H98`e=jzLrn*vYuDZ4l9CD%0LAPA-=m@g!gxpC zh^=}nhHB$B9FHjP{U%SwZzd#V=sI5g$tYU5FFUjB<;C_W`}EZB$_K6+P@8n2 z>}yHTL3SX(e3w_iG(}o(y0WtMBy+CSXXTt&>Z4ifjihk9?ZZV{I^=M?i0_U)qqs-z zuS1qg5fzmu|2)*w87N#_^*IfIuW$aac3n+sRSXOWRKgX18d4sA`P3KuXgEDPs3Htf zQxlTnRz@tEcO3Mc3OPO7ViTFAnS$}%{U!R;Ha6wGzSkL%zh_C^A z={m6BSpQP$MaKc zhYndMa$myA`a{6vxwk{89LN(mzb_3(OFet`OhQ7!>*DBTRr^7k_2Owh^6Nm7?>Kt* z*)WD5l%YnzRlJGk_1Q}ja4pDx7W#+n$-1X`y&gI1kmrY?eKD@KkO13Nh zpUm6H92Q_Lt2w*lf2!4+Y?oP^6(lYS9jWi~*tvAZkaCXp>X_A!9 zdt_lA9EQELfa%_7fB)fMX#q&rxY1=!>Gcl|+Rf}Vt@poEy#F*j9L7X6S_D)lg3hUL z&2Y*z-@WpvV3(J-`fFl{*Twqe$;k8}LPrNAsHcNtp!!q10cXMpFVnG1(29nd;mo%h z*F*k!Q2AAE|m6d?O-pSx@128szn-zj)2iSDJf?iIyQ~(!ECih(cH`=Gy>b z5jmoY3!-))VE@nH-Jv1SZ?9?%SBD6z_5dm>DsN%iHlf8a{o7sFT4l`w*P7wDsL(ju zpBf|^s?50l>w39A0K&C-xa5B8|Fc?y$ywyeC#I%+F3a^--fHHg-|d-gbmf2Wz;=JO zu}v%`KYzh>9pI6Z2j%WA8eQ^oaW(8>$1g?10AOKrlTYXQY-}u|(FjwP=`kMC@kvn) zuF&YmjO#P7hNWW8(Gfj8yR)4mt)hw|dY3p)xh-BXlE>VSxcxDP@*eH)3+#PTl?cl0 z$Vl9lWCOSPmzY3|{h1A};usmIxGN+fo0rE@X3}t>?FdObthiZSU46a|AC;$pv;avC zU*Vhz3M^W?yf}xlC^C2QVuGLlqCfD2RP$pmcFAa`a@H#<5*Wn^^|2$^8U{2r{CBn( z&Vi_k(B-28^tMO4w2TnA1MV1!9G~&crKYA~Oq+(p%9(4!^_oAVrE4!&S#@0Zu;xg3 z+=E*q`JM=46?{FeA9F^NE)N1^hjz^~?}^DB)?#f5C8wxa8NaW;(B3Gk-<0TtJ3eU+ zC;q3<;^O8$KKS%FA)s0wKXfVJ8U8;xeg3iU=;xk99)AAVj|Y(I_G_?5i)VfK{YijU zdLF*ugv5R4B@V|u8jbwtAs!>HuE``ubMxXpUyjc=s|_sgcOSO_;h~6>e%#mb2@2Zx zB{1R`!o7fYJqOR3y61r>uDdr5lMYwNu1p~d6ij+(aR7HQlZKcU$Z-z1S)60UAAwX`Df&{xs&cXoo_|Vw^(i$DeuW>sMPHV=}8>)|#s74v0}?!DI#x z5Y?>pJOcVH5DJn{l4eB^MSnSC=!*u#TJgQzc{=6hc%Wy)zp@U|SLa3-diCD?aBSph zTwENjPV3=JeT<@D^qga5ty1%l;0i_jWUy$!83o{C443+PNG_j)#(!-k+P*$D*By@C z;jlt{Nrdb)%z8E;)xBT9<)DHv#$o-MDe{4NdD=SNG#h0O7YUd?vyZyy4y2OVf`vDQIQ|!zU+OC#q3@ zSBM4=@-;CCNbTN1#gY5m*DC4ex}60L)pj%N??O^1_2ES)js1c~e61tRs^q>^< zNeFt2h~OoOsDZKZU)SEl#J*AaW{a(C3w5OZrB#9w_XL?rF zhwN>@3{K6>{I=LI-ES=6YPpL|S0U+c?jQf$W^=(qpwPDD7 zh%Pn(7lyU&V;lW|*H(gY=~@gSrNTU4ZMwxlhmfq_A=H3$k(RtER>_I9## zd#yj)lcv}&zKJK8_GB6GTK{D|xFwv=5^?gT%n&h!1><%sY7X@)jgY`cU%;R(@sBG} zs@6d}-ea`3j&sre_Y}P%o*~fLaY6+tGTT0tT3VOD#Sr2ZiP*`2QF8pstx3b#OaH^) z4}n1h-+V{wJnST5&#lm%%v>O{O|jGO#4*AC#Odek{xxg*!&}brIAa!W5KZ6Av<_c& z7zN$T1zcl@NHqy&Z9xqW%P+wXl7aZti|dnfE;+eRYisssaDzZh4D%N+BSOWZ*AK8p zQ|dsI+l=O5LW~(_pV&*3504O#d;4ovy?VkIhrVvNnYs+4slEX9t|_R+hynX7?NA9t z%}N3KboWW}!pIMLg_ZRie!0I@ro_>le8YVhT zeH+lKGCeNM<7EhhN0cpsIsEvJCKAGX*fiG3aAJqoc z*75g5=^cZumlYK?P85KM$P0`|A@f#0uRGP>?yA@N#XOBr$G={Sj$!mlE`|&ty5Enh zUoZyaA3O@x2H+SmDh`Rdp-v!dWIyOiIAXNlxxC){+h_I1CS#AE%(bo@jx2tNB%*jQ zHa5l~_zfMGwn-f^(k;uo)bm_u>tV3{o7 z>4?E~5g}>5#VPP_5pflh)sF*-c6LgnX@(Z|dVU#-V&+hYhI`{p$^pnCX+oF=`Z zhwqXvkb`;YnC0-R#lZXP>xZX1;zvE}Q%4r1`<$YDl-wX5G-uv^YmD-nOgg(r>~QhZ zM#(@uIU0O_)a;#Su;@vb=W+4z1WN&%UooLW_$g^=KO(^RkAjd~IEAC3smZp{oL@+Y zTUt8n?OVLc%1WTd9NNiZgk#ZhXj5&qd&9xOQU3L-k=0@8w*^>Ob4$qZZS+-DLFKau z%nASE;E-5MYaqzaBcAo{vtj8PsIO6$-{m{)`>E_6FqD+$qWSmt?cr(*@Ol3!k)y^k zR(cKO3sJWNp$_zwkHRc)@d@q+3?BC5cSpyv%AJt@0<^O5D9@0C({zHMrJk^JT%P+J zKr-kYZFOAudi#ymC3^As;MHXN@4v^N+c4<JhvrfSh4(zN~vI$iyly{^4N*jK*dmhQKoT6=?wwp8Nd8=8kfN?Q_x-1;M33kwB(g zGD@4?fehP~bDo!mw4&cj3P|mKKG(>(NG>Agz2V*v+8EB+tv`fl)%osCmg>6ayB^Vh z4IL_h`)=y0-PyW>tm8KL$dBXAdQT+P6FH@%023}=UK(a*Egc;)UfoZHrKKC8zdL%5 zmb)K&t4M+{H7z>Fyu7@=OI_e2WjZDOX8eupZW#yg#AqG(z;8OZfz)d%$w>YZ=>3wPR;J98KY7io+`VYse!NMS=jTM6(&o~7gE`*?@AOfuViJ<+fRt-m=kwXBn z>kc!b`)P^1^$t>=M>9XS9CwNwFL!!BT6@bkNu`KE$&xMJ(6rY47&n87&+x5yfqn3VSR zT(}9=*4AdVTsCVEqEiawB4QBJ&}uNpoG2j5J@5Jm)S>0vEosz140ABBa{MJTQ} zciXkkujjb`r1Vr=tCjO!-ozrdok1sb69 z9feJ;X_ON>i1kBqY(fI9Q^-X~g1lNVh$~HDSgzfQolCViSdidme)UqLDkN@_6gUO6;;%Kn}If$?{FJ?**X zR-8%wV}ws|=1hZq$BoQ?`?hk3eajb&xZF-?(T((@dzwM60&wC;S^7qI;CHS+;~ivE zisbIYPT{3t(Qqolbto(roN_AUsAD1nIKTvOOUF3AmN4;}GR7i^IpP#Qi$|*sN8U<@E zEXFdKXh~tu-7DsMV0-%xlBI=ny|TKoIWYHT&P9%G_Bt~t$yB4riaF!2#)=}aMjfI0 zC#HW`;em=R8y6w<`)y-P3U3r8vDoQjc0vjhRy=m=;o~6CAHtX?+ZUs=u-9m1Bofxw zCZB|(m2rHs?CHaDTy**8}_*7H&3Bm>13C#U3v8LMhE zqqP=NELR6*b&!g&rvNFSlD_Uu*( zj_CsDs_?;e&}#pPr|aN|CnVF-l$Ms(hO7lI{-V0CtIo7($42X_3q{H`|u`| z{5oLkxu@MZulzkp#Z4#RM>n9->WDn|l9GJ$nUcx2bZKyYZ#uAFU$2X-HjbgP2hYoR z;wU^(zim9Aw*Oxltmo-)Wx2$U} zGr7**O$?8;x16M?qT_cW^pj>?-jf>L^;C1FK{fGkbgRU=y8nodC5hP;JPcU=_1}!z z62J@vV#fBRJorb)Nh&+?WMGkrx!jA_8tkB)ieCvM470nE$2i+i?MfNBWxscI=a~F9 z@Q0>+BK4QYU%^YUj~|u4*q2|& z{Sgsm$1eYwE@Gan(r4evBm+8h+fTp44&a>dF?b>&-D9riIkobC??Svy@Rv^Hi9~Z| zt7-i#Nk*r-B;%3_iZ6QjBcsb7jGw+Yw`z5Xo2G&4?0Rzjf5VCqE+K0+xrsR_?rv$32#*Gn(~NEA(Vi8dCGvU`O%xNKYa zSCYd?oEL9}bBpamRp>aUORY?ZP}9hN(c?Vq402oS)Dz3mRv~^f z*a-}II;-=5QePJBJG+O;v|E2p3zP|iLz|r7FI|@sO~Eu7^Zr+uMi3h{uh*|&bJFiC|8Qym}~!Rz3+>TrIe{2x>mteIMfSK@niNhev6i;Mq###`n)Kh&Uk-{_Ox zHM_VBKiX)mtyTG$!@M1i`wb?`APdY+-*Jp}RMb>Y_{s1Xggc(8>8e(#*u4FJzvybh delta 10186 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 ZJjEnhzb^1Mrvm-EG*ony%N4EP|3AuqkKh0R From fabe1e98a7139c304b52961d9cd3653e9cfc6b39 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 26 May 2017 12:02:26 -0500 Subject: [PATCH 24/80] update blackbox.dm --- code/controllers/subsystem/blackbox.dm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index ecc5f3cc17..f606a0d61a 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -1,8 +1,8 @@ SUBSYSTEM_DEF(blackbox) name = "Blackbox" wait = 6000 - flags = SS_NO_TICK_CHECK | SS_NO_INIT - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + flags = SS_NO_TICK_CHECK | SS_NO_INIT + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME var/list/msg_common = list() var/list/msg_science = list() @@ -86,12 +86,11 @@ SUBSYSTEM_DEF(blackbox) if (!SSdbcore.Connect()) return - + var/list/sqlrowlist = list() for (var/datum/feedback_variable/FV in feedback) - sqlrowlist += list("time" = "Now()", "round_id" = GLOB.round_id, "var_name" = "'[sanitizeSQL(FV.get_variable())]'", "var_value" = FV.get_value(), "details" = "'[sanitizeSQL(FV.get_details())]'") - + sqlrowlist += list(list("time" = "Now()", "round_id" = GLOB.round_id, "var_name" = "'[sanitizeSQL(FV.get_variable())]'", "var_value" = FV.get_value(), "details" = "'[sanitizeSQL(FV.get_details())]'")) if (!length(sqlrowlist)) return From 5387b4e2a76591ed8b0b7d9258e2ac552c38269b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 13:20:50 -0500 Subject: [PATCH 25/80] Makes a thing use QDEL_NULL --- code/game/machinery/doors/airlock.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 1750aa7aa8..cfc5eb2979 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -199,8 +199,7 @@ qdel(src) /obj/machinery/door/airlock/Destroy() - qdel(wires) - wires = null + QDEL_NULL(wires) if(charge) qdel(charge) charge = null From 3e05ac328a14c9a87e6d68ac3acb93612e079a79 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 13:21:59 -0500 Subject: [PATCH 26/80] Fixes typos and lies --- tools/readme.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tools/readme.txt b/tools/readme.txt index a1c1a17c3b..fbd99e3760 100644 --- a/tools/readme.txt +++ b/tools/readme.txt @@ -1,6 +1,4 @@ the compiled exe file for the Unstandardness text for DM program is in: UnstandardnessTestForDM\bin\Debug\UnstandardnessTestForDM.exe -of -UnstandardnessTestForDM\bin\Release\UnstandardnessTestForDM.exe -You have to move it to the root folder (where the dme file is) and run it from there for it to work. \ No newline at end of file +You have to move it to the root folder (where the dme file is) and run it from there for it to work. From db90467ff2bacce9e7c023d12ffadc0da2662980 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 13:22:05 -0500 Subject: [PATCH 27/80] Deletes the old java mapmerge --- tools/mapmerge/old_java_mapmerge/MapMerge.jar | Bin 20574 -> 0 bytes .../old_java_mapmerge/Run Map Merge.bat | 4 - .../old_java_mapmerge/Source/.classpath | 7 - .../old_java_mapmerge/Source/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../Source/.settings/org.eclipse.jdt.ui.prefs | 60 ---- .../Source/bin/FileFinder.class | Bin 1882 -> 0 bytes .../Source/bin/MapMerge.class | Bin 3519 -> 0 bytes .../Source/bin/MapPatcher.jar | Bin 10136 -> 0 bytes .../Source/src/FileFinder.java | 25 -- .../Source/src/MapMerge.java | 108 ------ .../src/MapPatcher Source/Location.java | 42 --- .../Source/src/MapPatcher Source/Map.java | 314 ------------------ .../src/MapPatcher Source/MapPatcher.java | 304 ----------------- .../src/MapPatcher Source/SavingThread.java | 37 --- .../Source/src/MapPatcher.jar | Bin 10136 -> 0 bytes 16 files changed, 929 deletions(-) delete mode 100644 tools/mapmerge/old_java_mapmerge/MapMerge.jar delete mode 100644 tools/mapmerge/old_java_mapmerge/Run Map Merge.bat delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/.classpath delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/.project delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.core.prefs delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.ui.prefs delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/bin/FileFinder.class delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/bin/MapMerge.class delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/bin/MapPatcher.jar delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/src/FileFinder.java delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/src/MapMerge.java delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Location.java delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Map.java delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/MapPatcher.java delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/SavingThread.java delete mode 100644 tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher.jar diff --git a/tools/mapmerge/old_java_mapmerge/MapMerge.jar b/tools/mapmerge/old_java_mapmerge/MapMerge.jar deleted file mode 100644 index d0f0ce08028cdbb917fe185b48e331f8433d49c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20574 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 AYXATM diff --git a/tools/mapmerge/old_java_mapmerge/Run Map Merge.bat b/tools/mapmerge/old_java_mapmerge/Run Map Merge.bat deleted file mode 100644 index 5bb8f1736b..0000000000 --- a/tools/mapmerge/old_java_mapmerge/Run Map Merge.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -call java -jar MapMerge.jar "../../_maps/" /wait - -pause \ No newline at end of file diff --git a/tools/mapmerge/old_java_mapmerge/Source/.classpath b/tools/mapmerge/old_java_mapmerge/Source/.classpath deleted file mode 100644 index 8a11d5b17e..0000000000 --- a/tools/mapmerge/old_java_mapmerge/Source/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/tools/mapmerge/old_java_mapmerge/Source/.project b/tools/mapmerge/old_java_mapmerge/Source/.project deleted file mode 100644 index df472fbdf1..0000000000 --- a/tools/mapmerge/old_java_mapmerge/Source/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - MapMerger - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.core.prefs b/tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.ui.prefs b/tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index ea0a123b8b..0000000000 --- a/tools/mapmerge/old_java_mapmerge/Source/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,60 +0,0 @@ -cleanup.add_default_serial_version_id=false -cleanup.add_generated_serial_version_id=true -cleanup.add_missing_annotations=true -cleanup.add_missing_deprecated_annotations=true -cleanup.add_missing_methods=false -cleanup.add_missing_nls_tags=false -cleanup.add_missing_override_annotations=true -cleanup.add_missing_override_annotations_interface_methods=true -cleanup.add_serial_version_id=false -cleanup.always_use_blocks=true -cleanup.always_use_parentheses_in_expressions=true -cleanup.always_use_this_for_non_static_field_access=false -cleanup.always_use_this_for_non_static_method_access=false -cleanup.convert_functional_interfaces=false -cleanup.convert_to_enhanced_for_loop=false -cleanup.correct_indentation=true -cleanup.format_source_code=true -cleanup.format_source_code_changes_only=false -cleanup.insert_inferred_type_arguments=false -cleanup.make_local_variable_final=true -cleanup.make_parameters_final=false -cleanup.make_private_fields_final=true -cleanup.make_type_abstract_if_missing_method=false -cleanup.make_variable_declarations_final=false -cleanup.never_use_blocks=false -cleanup.never_use_parentheses_in_expressions=false -cleanup.organize_imports=true -cleanup.qualify_static_field_accesses_with_declaring_class=false -cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -cleanup.qualify_static_member_accesses_with_declaring_class=true -cleanup.qualify_static_method_accesses_with_declaring_class=true -cleanup.remove_private_constructors=true -cleanup.remove_redundant_type_arguments=true -cleanup.remove_trailing_whitespaces=false -cleanup.remove_trailing_whitespaces_all=true -cleanup.remove_trailing_whitespaces_ignore_empty=false -cleanup.remove_unnecessary_casts=true -cleanup.remove_unnecessary_nls_tags=true -cleanup.remove_unused_imports=true -cleanup.remove_unused_local_variables=true -cleanup.remove_unused_private_fields=true -cleanup.remove_unused_private_members=true -cleanup.remove_unused_private_methods=true -cleanup.remove_unused_private_types=true -cleanup.sort_members=false -cleanup.sort_members_all=false -cleanup.use_anonymous_class_creation=false -cleanup.use_blocks=true -cleanup.use_blocks_only_for_return_and_throw=false -cleanup.use_lambda=true -cleanup.use_parentheses_in_expressions=true -cleanup.use_this_for_non_static_field_access=true -cleanup.use_this_for_non_static_field_access_only_if_necessary=true -cleanup.use_this_for_non_static_method_access=true -cleanup.use_this_for_non_static_method_access_only_if_necessary=true -cleanup.use_type_arguments=false -cleanup_profile=_Default -cleanup_settings_version=2 -eclipse.preferences.version=1 diff --git a/tools/mapmerge/old_java_mapmerge/Source/bin/FileFinder.class b/tools/mapmerge/old_java_mapmerge/Source/bin/FileFinder.class deleted file mode 100644 index ab01a656c458ab21fe7af582f5c7246df388f46e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1882 zcmb7FZBrXn7(F)$EQAGGNTIbLMXi!eY3ggWi>W}1Vne76O$A>!$r3Imo6PP_$A0!# z_%GD4VC{_4&;BOI@!UJm;Q!^Y_1h{srJYd}kmc5MPs3cTIX_ z*EbLonA>+AI%!YV)4QBV=Vh&-=c{f(22$010i))q(w@t=i`nkvyN=r1XieHg-mN#i zvW^7;=US;vC9COW-*+BmWuTZeoR<~PQBB_!NcGEE>QlqcaOL2V^rXrVdZCq4b-YSC zuYBoM>|{Y8wpuT{aYQk0VgzRdq6^7_feC@hkajnhIL=~x7=$xnU?`4hTrhB6;6itg zT8jLmK)JQR#4EVSJ}a)e)OOsqy@&Q#f!%L+!;^8(4QK!sjNksTgGOzTUax2`-Dw9q&D#>K07|P6mYt)49OjR1U@%$2U(sK zr%b1H9j(pczFSgua%UJh+%>Q%Fx$;u)9nz$#22_n)2(jiw$^j^Nph}7>z)NvFSZ-* zRH7$Qx5L>1y*cb)v1j_ldqz|*6mc}KoYD^)PNQw8?>jx)Zts5~zswDBn*1vhAL1kW zB42O%rSK}H<8|jP3t!b53S93geB$CgCY|d57Z!VjM>~ zni$6zk{sV#Qeq>zup6Sd3qG$lxbNG|qhL2|gCcS-<1j;uEY! z@H0$)Bv^g@!Ef03g-KC7FFeV{5`4~Kme;c`Y_))n3(q5uEfyj;?xVm$1~2Icj79M! zqm<KQUu4zQy+L_!XOA+8APY5^noIvl@g3;peX>)qmy diff --git a/tools/mapmerge/old_java_mapmerge/Source/bin/MapMerge.class b/tools/mapmerge/old_java_mapmerge/Source/bin/MapMerge.class deleted file mode 100644 index dff913a6b9443f37dd53caf7992a08c542a9cf10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3519 zcma)9YgZfB72Q`7%pecgR{SEEWGFc1VUUCABY<&j7biG891APKY2yyk0Aout>SzQe ztsA>_)1+zKhx^K-Y10>dH^!-;_Da9EYxQGSv--Kep=-sUsC+?eUknhGKU+s+&FMm%HKv+;@P^JdBusIlx^fzJm< z{k4K;W#WmHVcVuVAP~(N-rS_aAbEiufr)K7@fj;)#!qpLHtJw1W7(EBBoJ=zND4%b zJ8AA$FR=Z-n045S?FzP4VM#3JJu|Bzh6e;fmMyR|*or%iNO%d)HI3{*6dHDF*oEB! zwS%QS_q1Kv`bZzO1)Y@{<}yF-B)cw$O%XPf-(P z(W;o>Qo_lal$1TIFPOHcFSw39+Y`l8NGLd6#z(1CcxsrGHBfRgSjLVbiDwi%T{iXw zu&yf&Q&P5DedB~@q%KUlM#@z2tU%|uqtD3FaBtVtecp7-)^n~iZ>7z&p0-?`1&+Je zqT(|ID@oNoN6)hDX`Z1#`gIBRoQBUzOf~*CvK^;2q>$zzV4D{`*+Do;olqmCH zG#QxqH_@v=9kmyTk>VMZQV8CtrJ&Suilr9ZqQrDH1vK1M-PDV@ps@wI0yR|^ad0z< z4KYl;Par$rKNb|s5M9EWwGFS}a`&E+mjAD49Z3~L-S&jDKtAooQYF%kzUUP61%qOc zOiQsHk%SgB%u7Nel28Q~1$J*7+QDIStYFEKM6nOgYxq3AKyv4eOu?KW&_^m;HaO(V zy;NC`C>GGC;susVxAMB}c)Fo8h?S-?JSuYmS2TPHU*<_`NZpm8%jaIeVMXW? zIyT<|zM|npUmczk*vkxG((p3A#;VR4`Ee#WVzYPHerM(4*EPHn#bQCZGH-t5;^yv5>GL8pN80dBd|kL6BpGri4FZv_4+HP0*; z(5&JYWTt1D-CfA3_$6!8oywR7&xT*)w+enkQmI;YS!&L7HRx#JOy10}yLl@;%0N8X zBD`yJ@&de9SF+Q{@x)B2)53hI^yd|!1;NbpId(JG0w|>yGi`b06~%MT<&AlEi<&d? zc~;V)dBQ2UDfYFzfa{6W|1#;3IMBkgH_Q*05Tf$R<|ryJDn29pt>c@(7QXfRRzSmT zXj98*Siz2)*mJ}8e9-p_`M>qFZt`bAPu}Sz|2Ut5^EI6-*t_9Y>rbk_ixwE*Av{dO zI!Pm8eT3r(S6U?uktd7@XRdXId&BQx-zxUsME7mPr(%z;;LzwYy1Q2Kv8TJ<#o*Y1 zB0l*R9z3v$6H9n*d>JQW<3*h6F5=7*{MWO5mD8Ut;<;t)DZ=>QLH%gks-oQ>&Mw}O zy}T;tDRszF5TNBCh(Jlk2a(w)Rio@Rh-)H_;&7uSxf{e>ELm z5+Xdbg#D!m&8zsPjBuS1I-865ZV^8SB3%uO=1$i6?X`c%0B^96OV}6e-ybQtH%2}b z!TSM%q2@QRB?yE=&6Q}-QVJ6LArZ)}iuh6NC+n#!t*yu$SMak6VEqv}x4!Mq1MB{p z#z=oH{}hGNoeIa65>t`Jn#5F1V{Kxpwoys+tBvX^eswjpw)gclA=@O7(TkJ-C>j+# z7}s$EzvH;bYQD#M z{)N_m!;|y*Cqh;aAAc-J4b zQs#f;sD?;diTWM>L(#={Sm8(^sv4|P_$u2Z5Ojbk%Qq?LHq>u<_%0q2cNtXvwcbIj Z7^AU7(XV!z#zetWMSd{MnL>` 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 I_ { - private PathMatcher matcher; - public ArrayList foundPaths = new ArrayList<>(); - public FileFinder(String pattern) { - matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern); - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - Path name = file.getFileName(); - if (matcher.matches(name)) { - foundPaths.add(file); - } - return FileVisitResult.CONTINUE; - } -} \ No newline at end of file diff --git a/tools/mapmerge/old_java_mapmerge/Source/src/MapMerge.java b/tools/mapmerge/old_java_mapmerge/Source/src/MapMerge.java deleted file mode 100644 index 552a406b13..0000000000 --- a/tools/mapmerge/old_java_mapmerge/Source/src/MapMerge.java +++ /dev/null @@ -1,108 +0,0 @@ -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Scanner; - -public class MapMerge { - - private static Scanner input = new Scanner(System.in); - private static Path pathToMaps; - - public static void main(String[] mapPath) throws IOException { - pathToMaps = Paths.get(mapPath[0]); - FileFinder dmmFinder = new FileFinder("*.dmm"); - Files.walkFileTree(pathToMaps, dmmFinder); - ArrayList foundFiles = dmmFinder.foundPaths; - if (foundFiles.size() > 0) { - try { - MapMerge.merge(foundFiles); - } catch (Exception e) { - System.out.println("Something went wrong."); - e.printStackTrace(); - } - } else { - System.out.println("No files were found in provided directory!"); - System.out.print("Path to maps folder: "); - pathToMaps = Paths.get(input.nextLine()); - dmmFinder = new FileFinder("*.dmm"); - Files.walkFileTree(pathToMaps, dmmFinder); - foundFiles = dmmFinder.foundPaths; - try { - MapMerge.merge(foundFiles); - } catch (Exception e) { - System.out.println("Something went wrong."); - e.printStackTrace(); - } - } - } - - public static void merge(ArrayList foundFiles) throws IOException { - - System.out.println("How many files do you want to merge?"); - int selection1; - inputCheck: while (true) { - while (!input.hasNextInt()) { - String temp = input.next(); - System.out.println(temp + " is not a valid int."); - } - selection1 = input.nextInt(); - if (selection1 < 0) { - System.out.println("Use a number greater than 0!"); - continue inputCheck; - } else { - break inputCheck; - } - } - - for (int numOfFiles = selection1; numOfFiles != 0; numOfFiles--) { - - for (int num = 0; num < foundFiles.size(); num++) { - System.out.println(num + ": " + foundFiles.get(num)); - } - - System.out.print("File to use: "); - int selection2; - inputCheck: while (true) { - while (!input.hasNextInt()) { - String temp = input.next(); - System.out.println(temp + " is not a valid int."); - } - selection2 = input.nextInt(); - if ((selection2 < 0) || (selection2 >= foundFiles.size())) { - if (selection2 < 0) { - System.out.println("Use a number greater than 0!"); - } else { - System.out.println("Use a number less than " + foundFiles.size() + "!"); - } - continue inputCheck; - } else { - break inputCheck; - } - } - - String selected_map = foundFiles.get(selection2) + ""; - String backup_map = selected_map + ".backup"; - String edited_map = selected_map; - String to_save = selected_map; - String[] passInto = { "-clean", backup_map, edited_map, to_save }; - MapPatcher.main(passInto); - - // Will try to fix when I have time ~CorruptComputer - /*try{ - Process process = new ProcessBuilder("dmm2tgm\\dmm2tgm.exe", selected_map).start(); - }catch(Exception e1){ - System.out.println("You are not on a windows machine, trying the .py"); - try{ - Process process = new ProcessBuilder("dmm2tgm\\Source\\dmm2tgm.py", selected_map).start(); - }catch(Exception e2){ - System.out.println("You do not have python 2.7.x installed."); - System.out.println("Downloads can be found here: https://www.python.org/downloads/"); - } - } - */ - - } - } -} \ No newline at end of file diff --git a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Location.java b/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Location.java deleted file mode 100644 index 2a901d54b2..0000000000 --- a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Location.java +++ /dev/null @@ -1,42 +0,0 @@ -class Location -{ - int x; - int y; - int z; - - public Location() - { - } - - public Location(int paramInt1, int paramInt2, int paramInt3) - { - this.x = paramInt1; - this.y = paramInt2; - this.z = paramInt3; - } - - public void set(int paramInt1, int paramInt2, int paramInt3) - { - this.x = paramInt1; - this.y = paramInt2; - this.z = paramInt3; - } - - public boolean equals(Object paramObject) - { - if (!(paramObject instanceof Location)) return false; - Location localLocation = (Location)paramObject; - if ((this.x != localLocation.x) || (this.y != localLocation.y) || (this.z != localLocation.z)) return false; - return true; - } - - public int hashCode() - { - return (this.z * 256 + this.y) * 256 + this.x; - } - - public String toString() - { - return "(" + this.x + "," + this.y + "," + this.z + ")"; - } -} diff --git a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Map.java b/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Map.java deleted file mode 100644 index 949db7e6ca..0000000000 --- a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/Map.java +++ /dev/null @@ -1,314 +0,0 @@ -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; -import java.io.InputStreamReader; -import java.io.PrintStream; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Set; -import java.util.Vector; - -public class Map -{ - boolean sizeunknown; - int minx; - int miny; - int minz; - int maxx; - int maxy; - int maxz; - HashMap tile_types; - HashMap codes_by_value; - HashMap tiles; - - public Map() - { - this.sizeunknown = true; - this.tile_types = new HashMap(); - this.codes_by_value = new HashMap(); - this.tiles = new HashMap(); - } - - public Map(File paramFile) - { - this(paramFile, false); - } - - public Map(File paramFile, boolean paramBoolean) - { - this.sizeunknown = true; - try { - BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(paramFile))); - - this.tile_types = new HashMap(); - this.codes_by_value = new HashMap(); - this.tiles = new HashMap(); - - MapPatcher.Systemoutprintln(new StringBuilder().append("Loading map ").append(paramFile.getName()).toString()); - MapPatcher.Systemoutprint("Loading tiles"); - String str1 = ""; - int i = 0; - while ((str1 = localBufferedReader.readLine()) != null) - { - if (str1.equals("")) break; - if (str1.startsWith("\"")) - { - if (i < 1) - { - int j = str1.indexOf("\"", 1); - i = j - 1; - } - String str2 = str1.substring(1, 1 + i); - String str3 = str1.substring(str1.indexOf("(")); - this.tile_types.put(str2, str3); - this.codes_by_value.put(str3, str2); - } - } - - MapPatcher.Systemoutprintln(new StringBuilder().append(" ").append(this.tile_types.size()).toString()); - if (!paramBoolean) - { - MapPatcher.Systemoutprintln("Loading levels"); - while (true) - { - if ((str1 = localBufferedReader.readLine()) != null) { if (str1.startsWith("(")) break label270; } else { - label270: if (str1 == null) - { - break; - } - int k = str1.indexOf(",", 1); - int m = Integer.parseInt(str1.substring(1, k)); - str1 = str1.substring(k); - k = str1.indexOf(",", 1); - int n = Integer.parseInt(str1.substring(1, k)); - str1 = str1.substring(k); - k = str1.indexOf(")", 1); - int i1 = Integer.parseInt(str1.substring(1, k)); - - MapPatcher.Systemoutprintln(new StringBuilder().append("New map part from (").append(m).append(",").append(n).append(",").append(i1).append(")").toString()); - - int i3 = n; - if (this.sizeunknown) - { - this.minx = m; this.maxx = this.minx; - this.miny = n; this.maxy = this.miny; - this.minz = i1; this.maxz = this.minz; - this.sizeunknown = false; - } - if (this.minz > i1) this.minz = i1; - if (this.maxz < i1) this.maxz = i1; - while (!(str1 = localBufferedReader.readLine()).startsWith("\"}")) - { - int i2 = m; - if (this.miny > i3) this.miny = i3; - if (this.maxy < i3) this.maxy = i3; - while (str1.length() > 0) - { - String str4 = str1.substring(0, i); - Location localLocation = new Location(i2, i3, i1); - if (this.minx > i2) this.minx = i2; - if (this.maxx < i2) this.maxx = i2; - this.tiles.put(localLocation, this.tile_types.get(str4)); - str1 = str1.substring(i); - i2++; - } - i3++; - } - } - } - } - localBufferedReader.close(); - } - catch (Exception localException) - { - localException.printStackTrace(); - } - } - - public void mirrorY() - { - for (int i = this.minz; i <= this.maxz; i++) - for (int j = this.minx; j <= this.maxx; j++) - for (int k = this.miny; k < (this.miny + this.maxy) / 2; k++) - { - int m = this.maxy - (k - this.miny); - String str = contentAt2(j, k, i); - setAt(j, k, i, contentAt2(j, m, i)); - setAt(j, m, i, str); - } - } - - public String contentAt(int paramInt1, int paramInt2, int paramInt3) - { - Location localLocation = new Location(paramInt1, paramInt2, paramInt3); - String str = (String)this.tiles.get(localLocation); - if (str == null) System.err.println(new StringBuilder().append("Null at ").append(paramInt1).append(",").append(paramInt2).append(",").append(paramInt3).append(" Possible loading error").toString()); - return str == null ? "null" : str; - } - - public String contentAt2(int paramInt1, int paramInt2, int paramInt3) - { - Location localLocation = new Location(paramInt1, paramInt2, paramInt3); - return (String)this.tiles.get(localLocation); - } - - public void setAt(int paramInt1, int paramInt2, int paramInt3, String paramString) - { - if (this.sizeunknown) - { - this.minx = (this.maxx = paramInt1); - this.miny = (this.maxy = paramInt2); - this.minz = (this.maxz = paramInt3); - this.sizeunknown = false; - } - else - { - this.minx = Math.min(this.minx, paramInt1); - this.miny = Math.min(this.miny, paramInt2); - this.minz = Math.min(this.minz, paramInt3); - this.maxx = Math.max(this.maxx, paramInt1); - this.maxy = Math.max(this.maxy, paramInt2); - this.maxz = Math.max(this.maxz, paramInt3); - } - Location localLocation = new Location(paramInt1, paramInt2, paramInt3); - localLocation.set(paramInt1, paramInt2, paramInt3); - this.tiles.put(localLocation, paramString); - } - - public void save(File paramFile) throws Exception - { - saveReferencing(paramFile, null); - } - - public void saveReferencing(File paramFile, Map paramMap) throws Exception - { - FileWriter localFileWriter = new FileWriter(paramFile); - - this.tile_types.clear(); - this.codes_by_value.clear(); - Vector localVector1 = new Vector(); - for (Object localObject1 = this.tiles.keySet().iterator(); ((Iterator)localObject1).hasNext(); ) { Location localLocation = (Location)((Iterator)localObject1).next(); - - String str1 = (String)this.tiles.get(localLocation); - if (!localVector1.contains(str1)) - localVector1.add(str1); - } - MapPatcher.Systemoutprintln(new StringBuilder().append("We have ").append(localVector1.size()).append(" different tiles").toString()); - localObject1 = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; - - int i = 1; - int j = localObject1.length; - while (j < localVector1.size()) - { - j *= localObject1.length; - i++; - } - Vector localVector2; - if (paramMap == null) { - localVector2 = localVector1; - } - else { - localVector2 = new Vector(); - for (Iterator localIterator = localVector1.iterator(); localIterator.hasNext(); ) { localObject2 = (String)localIterator.next(); - - if (paramMap.codes_by_value.containsKey(localObject2)) - { - localObject3 = paramMap.getIdFor((String)localObject2); - this.tile_types.put(localObject3, localObject2); - this.codes_by_value.put(localObject2, localObject3); - } - else { - localVector2.add(localObject2); - } } - localVector1.clear(); - } - - int k = 0; - for (Object localObject2 = localVector2.iterator(); ((Iterator)localObject2).hasNext(); ) { localObject3 = (String)((Iterator)localObject2).next(); - do - { - str2 = int2code((String[])localObject1, k, i); - k++; - }while (this.tile_types.containsKey(str2)); - this.tile_types.put(str2, localObject3); - this.codes_by_value.put(localObject3, str2); - } - String str2; - localVector2.clear(); - - k = 0; - for (int m = 0; m < this.tile_types.size(); m++) - { - do - { - localObject3 = int2code((String[])localObject1, k, i); - k++; - }while (!this.tile_types.containsKey(localObject3)); - str2 = (String)this.tile_types.get(localObject3); - localFileWriter.write(new StringBuilder().append("\"").append((String)localObject3).append("\" = ").append(str2).append("\r\n").toString()); - } - localVector2.clear(); - - localFileWriter.write("\n"); - - m = 1 + this.maxz - this.minz; - Object localObject3 = new SavingThread[m]; - int n = (this.maxy - this.miny) * ((this.maxx - this.minx) * i + 2) + 32; - - for (k = 0; k < m; k++) - { - localObject3[k] = new SavingThread(this.minz + k, this, n); - localObject3[k].start(); - } - - int i1 = 0; - String str3 = ""; - while (i1 == 0) { - try { - Thread.sleep(100L); } catch (Exception localException) { - } - i1 = 1; - - str3 = ""; - for (k = 0; k < m; k++) - { - if (!localObject3[k].done) - i1 = 0; - if (str3.length() != 0) str3 = new StringBuilder().append(str3).append(" ").toString(); - str3 = new StringBuilder().append(str3).append(localObject3[k].done ? "Done" : new StringBuilder().append(localObject3[k].progress).append("%").toString()).toString(); - } - MapPatcher.Systemoutprint(new StringBuilder().append(str3).append("\r").toString()); - } - - for (k = 0; k < m; k++) { - localFileWriter.write(localObject3[k].result.toString()); - } - localFileWriter.flush(); - localFileWriter.close(); - } - - public String getIdFor(String paramString) - { - if (this.codes_by_value.containsKey(paramString)) - { - return (String)this.codes_by_value.get(paramString); - } - return "???"; - } - - public String int2code(String[] paramArrayOfString, int paramInt1, int paramInt2) - { - String str = ""; - while (paramInt1 >= paramArrayOfString.length) - { - int i = paramInt1 % paramArrayOfString.length; - str = new StringBuilder().append(paramArrayOfString[i]).append(str).toString(); - paramInt1 -= i; - paramInt1 /= paramArrayOfString.length; - } - str = new StringBuilder().append(paramArrayOfString[paramInt1]).append(str).toString(); - while (str.length() < paramInt2) str = new StringBuilder().append(paramArrayOfString[0]).append(str).toString(); - return str; - } -} diff --git a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/MapPatcher.java b/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/MapPatcher.java deleted file mode 100644 index c8d50b9b2f..0000000000 --- a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/MapPatcher.java +++ /dev/null @@ -1,304 +0,0 @@ -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PrintStream; -import java.util.Arrays; - -public class MapPatcher -{ - static boolean silent = false; - - public static void main(String[] paramArrayOfString) - { - String str1 = "usage: [me] -diff [old_map] [new_map] [diff_file]"; - String str2 = "usage: [me] -patch [old_map] [diff_file] [new_map]"; - String str3 = "usage: [me] -pack [unpacked] [packed.dmm]"; - String str4 = "usage: [me] -unpack [packed.dmm] [unpacked]"; - String str5 = "usage: [me] -clean [oldmap.dmm] [newmap.dmm] [cleaned.dmm]"; - String str6 = "usage: [me] -merge [original] [local] [remote] [output]"; - - for (int i = 0; i < paramArrayOfString.length; i++) - if (paramArrayOfString[i].equalsIgnoreCase("-silent")) - { - silent = true; - for (; i < paramArrayOfString.length - 1; i++) - paramArrayOfString[i] = paramArrayOfString[(i + 1)]; - paramArrayOfString = (String[])Arrays.copyOf(paramArrayOfString, paramArrayOfString.length - 1); - break; - } - Object localObject; - int i2; - int i3; - int i5; - if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-merge"))) - { - if (paramArrayOfString.length < 5) - { - System.out.println(str6); - try { System.in.read(); } catch (Exception localException1) { - }return; - } - - Map localMap1 = new Map(new File(paramArrayOfString[1])); - localObject = new Map(new File(paramArrayOfString[2])); - Map localMap8 = new Map(new File(paramArrayOfString[3])); - Map localMap9 = new Map(); - - if ((localMap1.minx != ((Map)localObject).minx) || (localMap1.minx != localMap8.minx) || (localMap1.maxx != ((Map)localObject).maxx) || (localMap1.maxx != localMap8.maxx) || (localMap1.miny != ((Map)localObject).miny) || (localMap1.miny != localMap8.miny) || (localMap1.maxy != ((Map)localObject).maxy) || (localMap1.maxy != localMap8.maxy) || (localMap1.minz != ((Map)localObject).minz) || (localMap1.minz != localMap8.minz) || (localMap1.maxz != ((Map)localObject).maxz) || (localMap1.maxz != localMap8.maxz)) - { - Systemoutprintln("Map sizes differ"); - System.exit(1); - } - try - { - for (int n = localMap1.minz; n <= localMap1.maxz; n++) - for (i2 = localMap1.miny; i2 <= localMap1.maxy; i2++) - for (i3 = localMap1.minx; i3 <= localMap1.maxx; i3++) - { - boolean bool1 = localMap1.contentAt(i3, i2, n).equals(((Map)localObject).contentAt(i3, i2, n)); - boolean bool2 = localMap1.contentAt(i3, i2, n).equals(localMap8.contentAt(i3, i2, n)); - i5 = ((Map)localObject).contentAt(i3, i2, n).equals(localMap8.contentAt(i3, i2, n)); - if ((!bool1) && (!bool2)) - { - if (i5 == 0) - { - Systemoutprintln(i3 + "," + i2 + "," + n + " local and remote don't match original and differ"); - System.exit(1); - } - else { - localMap9.setAt(i3, i2, n, ((Map)localObject).contentAt(i3, i2, n)); - } - } else if (!bool1) - localMap9.setAt(i3, i2, n, ((Map)localObject).contentAt(i3, i2, n)); - else if (!bool2) - localMap9.setAt(i3, i2, n, localMap8.contentAt(i3, i2, n)); - else - localMap9.setAt(i3, i2, n, localMap1.contentAt(i3, i2, n)); - } - Systemoutprintln("Saving"); - localMap9.saveReferencing(new File(paramArrayOfString[4]), localMap1); - Systemoutprintln("Done"); - } - catch (Exception localException12) - { - localException12.printStackTrace(); - } - } - else - { - int m; - int i1; - if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-diff"))) - { - if (paramArrayOfString.length < 4) - { - System.out.println(str1); - try { System.in.read(); } catch (Exception localException2) { - }return; - } - - Map localMap2 = new Map(new File(paramArrayOfString[1])); - localObject = new Map(new File(paramArrayOfString[2])); - - int j = Math.max(localMap2.minx, ((Map)localObject).minx); - m = Math.min(localMap2.maxx, ((Map)localObject).maxx); - i1 = Math.max(localMap2.miny, ((Map)localObject).miny); - i2 = Math.min(localMap2.maxy, ((Map)localObject).maxy); - i3 = Math.max(localMap2.minz, ((Map)localObject).minz); - int i4 = Math.min(localMap2.maxz, ((Map)localObject).maxz); - Systemoutprintln("Comparing: x(" + j + "-" + m + ") y(" + i1 + "-" + i2 + ") z(" + i3 + "-" + i4 + ")"); - try - { - FileWriter localFileWriter2 = new FileWriter(paramArrayOfString[3]); - i5 = 0; - for (int i6 = i3; i6 <= i4; i6++) - { - Systemoutprintln("Z-level " + i6); - for (int i7 = i1; i7 <= i2; i7++) - for (int i8 = j; i8 <= m; i8++) - if (!localMap2.contentAt(i8, i7, i6).equals(((Map)localObject).contentAt(i8, i7, i6))) - { - localFileWriter2.write("(" + i8 + "," + (1 + ((Map)localObject).maxy - i7) + "," + i6 + ")=" + ((Map)localObject).contentAt(i8, i7, i6) + "\n"); - i5++; - } - } - localFileWriter2.flush(); - localFileWriter2.close(); - if (i5 == 0) - Systemoutprintln("Files do match"); - else - Systemoutprintln("Writed out " + i5 + " differences"); - } - catch (Exception localException13) - { - localException13.printStackTrace(); - } - - Systemoutprintln("Done"); - } - else - { - String str7; - String str8; - if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-patch"))) - { - if (paramArrayOfString.length < 4) - { - System.out.println(str2); - try { System.in.read(); } catch (Exception localException3) { - }return; - } - - Map localMap3 = new Map(new File(paramArrayOfString[1])); - try - { - localObject = new BufferedReader(new InputStreamReader(new FileInputStream(paramArrayOfString[2]))); - - while ((str7 = ((BufferedReader)localObject).readLine()) != null) - { - str7 = str7.trim(); - if (str7.length() != 0) - { - m = str7.indexOf(",", 1); - i1 = Integer.parseInt(str7.substring(1, m)); - str7 = str7.substring(m); - m = str7.indexOf(",", 1); - i2 = Integer.parseInt(str7.substring(1, m)); - str7 = str7.substring(m); - m = str7.indexOf(")", 1); - i3 = Integer.parseInt(str7.substring(1, m)); - str8 = str7.substring(str7.indexOf("=") + 1); - localMap3.setAt(i1, 1 + localMap3.maxy - i2, i3, str8); - } - } - localMap3.save(new File(paramArrayOfString[3])); - } - catch (Exception localException8) - { - localException8.printStackTrace(); - } - - Systemoutprintln("Done"); - } - else if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-pack"))) - { - if (paramArrayOfString.length < 3) - { - System.out.println(str3); - try { System.in.read(); } catch (Exception localException4) { - }return; - } - - Map localMap4 = new Map(); - try { - BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(paramArrayOfString[1]))); - Systemoutprintln("Loading"); - - while ((str7 = localBufferedReader.readLine()) != null) - { - str7 = str7.trim(); - if (str7.length() != 0) - { - m = str7.indexOf(",", 1); - i1 = Integer.parseInt(str7.substring(1, m)); - str7 = str7.substring(m); - m = str7.indexOf(",", 1); - i2 = Integer.parseInt(str7.substring(1, m)); - str7 = str7.substring(m); - m = str7.indexOf(")", 1); - i3 = Integer.parseInt(str7.substring(1, m)); - str8 = str7.substring(str7.indexOf("=") + 1); - localMap4.setAt(i1, i2, i3, str8); - } - } - Systemoutprintln("Flipping"); - localMap4.mirrorY(); - Systemoutprintln("Saving, bounds: x{" + localMap4.minx + " - " + localMap4.maxx + "}, y{" + localMap4.miny + " - " + localMap4.maxy + "}, z{" + localMap4.minz + " - " + localMap4.maxz + "}"); - localMap4.save(new File(paramArrayOfString[2])); - Systemoutprintln("Done"); - } - catch (Exception localException9) - { - localException9.printStackTrace(); - } - } - else if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-unpack"))) - { - if (paramArrayOfString.length < 3) - { - System.out.println(str4); - try { System.in.read(); } catch (Exception localException5) { - }return; - } - - Systemoutprintln("Loading"); - Map localMap5 = new Map(new File(paramArrayOfString[1])); - try { - FileWriter localFileWriter1 = new FileWriter(paramArrayOfString[2]); - Systemoutprintln("Saving"); - for (int k = localMap5.minz; k <= localMap5.maxz; k++) - { - Systemoutprintln("Z-level " + k); - for (m = localMap5.miny; m <= localMap5.maxy; m++) - for (i1 = localMap5.minx; i1 <= localMap5.maxx; i1++) - localFileWriter1.write("(" + i1 + "," + (1 + localMap5.maxy - m) + "," + k + ")=" + localMap5.contentAt(i1, m, k) + "\n"); - localFileWriter1.write("\n"); - } - localFileWriter1.flush(); - localFileWriter1.close(); - - Systemoutprintln("Done"); - } - catch (Exception localException10) - { - localException10.printStackTrace(); - } - } - else if ((paramArrayOfString.length > 0) && (paramArrayOfString[0].equalsIgnoreCase("-clean"))) - { - if (paramArrayOfString.length < 4) - { - System.out.println(str5); - try { System.in.read(); } catch (Exception localException6) { - }return; - } - - Map localMap6 = new Map(new File(paramArrayOfString[1]), true); - Map localMap7 = new Map(new File(paramArrayOfString[2])); - try - { - localMap7.saveReferencing(new File(paramArrayOfString[3]), localMap6); - Systemoutprintln("Done"); - } - catch (Exception localException11) - { - localException11.printStackTrace(); - } - } - else - { - System.out.println(str1); - System.out.println(str2); - System.out.println(str3); - System.out.println(str4); - System.out.println(str5); - System.out.println(str6); - try { - System.in.read(); } catch (Exception localException7) { } - } - } - } - } - - public static void Systemoutprintln(String paramString) { if (!silent) - System.out.println(paramString); } - - public static void Systemoutprint(String paramString) - { - if (!silent) - System.out.print(paramString); - } -} diff --git a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/SavingThread.java b/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/SavingThread.java deleted file mode 100644 index 24a3d7b04d..0000000000 --- a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher Source/SavingThread.java +++ /dev/null @@ -1,37 +0,0 @@ -class SavingThread extends Thread -{ - int z; - Map mymap; - boolean done; - int progress; - StringBuilder result; - - public SavingThread(int paramInt1, Map paramMap, int paramInt2) - { - this.z = paramInt1; - this.mymap = paramMap; - this.progress = 0; - this.done = false; - this.result = new StringBuilder(paramInt2); - } - - public void run() - { - this.result.append("(" + this.mymap.minx + "," + this.mymap.miny + "," + this.z + ") = {\"\r\n"); - - int i = (this.mymap.maxx - this.mymap.minx) * (this.mymap.maxy - this.mymap.miny) / 100; - int j = 0; - for (int k = this.mymap.miny; k <= this.mymap.maxy; k++) - { - for (int m = this.mymap.minx; m <= this.mymap.maxx; m++) - { - this.result.append(this.mymap.getIdFor(this.mymap.contentAt(m, k, this.z))); - j++; if (j >= i) { j = 0; this.progress += 1; } - } - this.result.append("\r\n"); - } - this.result.append("\"}\r\n"); - this.result.append("\r\n"); - this.done = true; - } -} diff --git a/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher.jar b/tools/mapmerge/old_java_mapmerge/Source/src/MapPatcher.jar deleted file mode 100644 index 5cbaad488c146d8a7453f114260dbccfe61e7861..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10136 zcmaKS19T-pyKT$~CKGdF+qP}nc5-4n6Wb@YZBCqtZB8aUvFFXad*841?%mbBR`sfH zcUSkSuU6Nttt1Nxg$@Syr__7^AU7(XV!z#zetWMSd{MnL>` zn9~19M*kD>53;nK^x|VoTEH>+ne~m!Glj+RDbEQRCYCPs69py| zSsIyTF($|bikglAl z-axVI4aW`9V>;Q?WBDoscga(Guth8-@sjX$$5z8$qx`>XwHA31(#qjR++1HTc;!ZXxZiU$h2$!qBtL|R3=Z|OTAfV$X`QJ=}e?2*e~=vYzzwL~z*lyP zrjo4Y*`-iq)8=I^I%;nR*EU{8r>ir{PWRa)+2=YOl%$wle1fbGW0i;brJ{Zg+0EyU?>U)E%3lbvkC znU0e@pR10O?WQe8$2{L7xX<#tnsVNu+xPQBcdQ{FLuCAGUW&6npnDu4-UkZ|aqnnD zJ{HJ`-q*>J{Y{h71(<&J$xRe`V!UgtqsYGyyc?7YX52}>Bo_+Gz9tsNo4**!RRa5H zUc}ZFq2JpI`lw&z*831&i01Z)qCYg(e~2#%V)y}nW=I>(JBw4I=c4y?24z4se3egN z7%N#t503z(xvC#rv7U{Nz@=oPlB zIcM&>j9^5MQrD{S8GxWhzF;V-@M$}z?l++;D*LwX+l;VBm(k>v0y_6`qJJp!se(G9 zEvfTr0CD>r(I?b-b?q7;2=Q0+{4xM=Up)E@ol&D(45TtLiM~Q>Pzwm#PmR{3HmGSA z2H}e57M{Uzk3YN2w#?I`{(>06qA`e2z4aau4&lsj{IJ^d49*Zr5I~ z-=B_dgIgn!)rHQCCWVniaxlFa8N`a-lx_ud5nsG>Ei!`|7c~o!U+MNb6wVi*nA4MT^Gj3+aMv){nB%Wer z$A=#+V?7lgp>@vEPMA($wG$!i%2-6mq{I`i;dDI1?aGnu^G9QY0Rpj7<%OQws0vOf^J0zeLdU~J~p zHNYHlFh(Y4qe^A4!N$2h!&Yh)$PcTc6GjSx|2AWeiIp4h5?jY(>(^Y=!%T)N45L<= zAdT50#HiDp&SM<8U}ra{dgmUKhjEuvfJGH_TcYUcFe<_AvCybgPaR4MH4oX6*c!*> zfefv?VA|nVSNx-Wj1O#>Ah@-Z@?q|MGtMc7bWjHyi6cmP71xfo8Gz>)0jbp;!r1zR z*1NhZOWzyI7*SMA$+K+>!WblrsY}V!1TDe!Bw`v4@zVFE)iphN_kvfGoNiI|WYhI# zI)Wp1ZBDd}YZ!_;6_>Pzwub8%c`>j)dBj}p;t6Asa-4~5;BT!5Uw{U`UCb>HlEe^} z_+h%kd&|v!2`0q4BfBu2moTsZ<@(~uB_UIGM0C;hW?wY`uzKJ+dN}6~0GKR2%j3dK_@5twzM`!8k$j{jiGWA>n=)A<_bPu$7~4U}89& zkb{BKf%JixLbO6jcIbhNlUU%p+;oko>zm+#@dE|JNkNI`IMivD5HrwI5K}Ny;8W03 zkW;X9U^%c_a9U91kaRF~;B?S*kc*IMkQ!hKv;Yhv_JV`mco;J+ z-vkuxw?=H?d}dP^CX%*%QM&DV9Et%WvHa0+DY%rPU$6)WTC8;z$ zE}>>#Z5O92C6*V0TFTXB%;^5equ+I6>CxWjW?v=`R357vlO!%^j6Azv4$OizX zO@}e(F9Z#Ma`yGljzd=6&~bZ2R*qEZYXLN76U-%Q!k}4k0^z7f|CnS?9o1MDhwuAv zPpg$q-Osch{bZ#0)(G~7-3@Jgcav))07QT(0iH=k$RWC)I4+Trf6X;)UfmFfoGOfx zU*J&AOj1_FNsQ`ngY1V;*Iky4(v=cD!Wl(Fun0#i@qs9!qAXRTG{g9Tn%QO-@Z-YqUv~^|1SYc~HcN0Xq^YpoRV)bsyLzfqM#fUkK&t(gOpS&3)$4x1)(>S9D?L-Qm=VNb0##}G$lWO;B#9L-UhC2e< z4m#g!8FBVl7SRxh@dDOKt7NQUp&sJ`Wa`#+?7xca^PIH>w|WDWU- z##MD~A4Un5nubrt;7stf=8)+W2^PM%EB)>+={sV^OfwMx+bghXOnmL>16NFRtaOhp zLq=$v0#+qECrX~JSwgzPKS8YyY{3{MEF-Y#Yogw6mMo09$QGdWdFH#BY zIFA$#EOpc6Z?y*|^Pq`VSn@Fj`B@`2cwCprH;)c>MJ3~4 z2{kdE zXRYpXz6T)eZ z0m!b5Pb<|_B3?-}s~QA0dAD@6_?*(UH?-eMXMyL$1E_@fK9z}tdQyKYrV;Cx!dK3cK=4#IsRYL;-F(~+Np)?v^u7v`-A4qiuJFPJWpuqS7?CPuK{urBhzu%Gu( zY4YF?Ytgli@!)N-@l@qiAX>UCifM+Wg2|0?C>_}1${8&Xh3T1s=`oo#Hp|G_OO`mo z-n!$_evde$q^4qR!dqeQ|2nw~j~me|yfgL|Ea8^?dWY2PQ2d#Hg#6mjUHCjPPwtUa zMWNH?%SmdHFgqa%sBP~_=2nBwdw?c#ISPE_p66Q4Nap}r`O zB=MDf?3Fo_r@Hbi`4@PdPhSQIw=;!iFSGf16vE?f`U?9sPoLhX)%P&%oM^e8B4wkV z=-j9D$BR|RKlI-oo!Et;rxa4tBsLiLiZG^yd+YAYU% z<=xRNvHkS$^9z|YFxc5`)m-ERoTuI+h4)nU3a?e2;WhGmK-L@AfonWG_Z#@o*IOHc zoi{N;wVu28<2-op%JIVGm^*^awBiN9uF3be5G$%0;@XLWz*@EMw_L>nM`_y#LcGAfhT}!%o4*7TSlCA3o7jfoTi-_J z`@Rj%x7>@}KGqA>zS@i4KHU4MeX$q6eX19teX|#>eXth+kmJYhRN{wp4e+77hI-Z6 zje2muUvj{bX?>MS-SZr@u%<+UI1-rGGe5uky5_6rkununrQ@#bx?U_}VPJTH1W;|Q z#+Ya@mv7OgsQbby%z0kQY%a2?b>T__ROG2xiNU$%uEWaEg4dOMON#7~uDgLriR6T| zka@!gs_grbgSYL_GR9_C)#Mr|tgPZaxc#PdNLE+mVy;8j$E#i>&x^eb5{{1 zGVX0=$}i7DJC^MzR?qY3<8v0Qw|~V1(g7Xh%i1<_)_Yghsy9DyvG?Co&&V0s#%Jp0 zFJ{cuxK0gKLW`3q`pVXNdbzut{8FI_fS(P}Od$a__@x_oNsQU|W8a4au*}<0Gp#t1)>!y%S4hU$=ZM$E z7>k0t2kYjPKQMa+Bu`)8INk$y%7|_pf6{*>Y#+z})c@dpmzykoZ1(jw#1rqEr8!Ms zS9?k22=T9>FFMqt672Y8~=X3(EyFxV-Or|(VRbGKA|2j_ENQ^060 z+ZW7wXUnD97u0m$wYu!-9M>D+dhdrnn}1;Z5|dNbH}YI7H{*`9$Et_HH^?3)*?A1q zA1>09^=h_-j(47a^J9A>Q^&pw7vACgIXylq#XElXX%p-ui;{|VTtJ~oSs^|#$an?* zrg7*tzAuy?|-Wpwvll*KlY2aUD9eO=bLrOk3@ zzx*lrsr!E8pZF9MG*Lpx+0M_ebKadkK;r*e}z$9m!m3%+Chl~e#D(9igv!N8;m{x?Yl^}i$)C1W>J zD|46sQdUN^e0Z|N&B^=YiMO}UlJ&FsdF+#n#?=< z+Vxw{Ke^>`-S(>G@ngAdnLEN#k-wFwABuS}CRK}cj(U!~L1P~#icw~hs$nK3V95K6 z@aEx2x>Hk-LlhE)!$6I}X81-&+guFqwK=3A^R+spr#CZHb~n|KKHYK#S?~A#GrHb^ zeFx0P`lr(2KA-XD9)p{v%oE2wq(1ZA4TGEzcDh!X&Cv^vs4J(g+_HNq-}DUvv_~J~ zBF%kp#@+~6Z9X!PUsMFShs>MMeguq%7c+b|nTISN38;KH9#9ZJLWt=@?oS8G7#4`i z$9}2^dWRu=G(p}uGQ?VDrw=WI+l4mnWZO-;CLx=o>~d5!byY#-Ss9qKjxJ9yzwt)^ zaYXnLb)6V(-9{TcUTQmZaj=#g#*_suu$2hc8hQpHt2;CaaUha-eB3_|U~`kVt+&@U zvZm{%STdbtpFXtC><`Uhw?B8=Ej(YWh776{j>*!1PV*RUM~bj2+`u8Su`lVsI-GL1 zJd(qyS1Vw!^iXBPkL4Z(`l%+LqHB+2Cal@0%<#1t?BX<`PLf{0`K z4j9F#b?~Lcmcze*$0=rL=>L%Y9TZQ8KO#tvKja()4Ee#=M2dz4I{)&N;bKJRseon= zfy@+SM2GGKgb&?sU>+B$8VY9%jN|Xwq2w|L=I01GeyXL|NkbI@nq?BihtcmD^VlFm zBLQ_pzI2j*0;;x7MYpv=KeM?9&B(Yg#bK&Lchclq(8sI6uR;cCFA_?JZ&2f<#m0nd zMihZ(iQcAES}%fhMCP}`qAX+qUK=C^qGQ8bw}|Lm$Rgm;9P}+Jo^YdCgYd{E*}PSJ zJx5c>qxe}w$l(CpfORDz(ni#zJtNz74!2!y*j4J-!oV=|D3M?p^aiT$pJh`bRb*ES zr%*-d_P!ide=3QQGyP(X0f+}4#C|p47!DyGjAjs|#I?3{4Scwzx5s*D2ucOTX;BFq zZ3|T+#1`S%aK<6IZSA(&R$y?l3~Z4dAo5BNMc`RP?G@+(nvO!pQq8B2XzLI;$z8+s zNamEDUgC_{ly}f#+9E8Wzw9ljwUD1K5sXVUTS)l$)W--rMz^`^E3}nQP*-01tNyCG z`E;B&Sdr{zh(K+>nGiRKp~tZWCns%baLGiRNIis*et*6XzK7Qi=x0(+$x65#F2|y( zvBSppFAJ@zNz|egHn`&B-3|LK6x6 zCavZAtVfVX7+cJ%W*We-SQy+z`k>bwHnNgf`j~d%dZ$ApUZgvrB zVb8f(;X2#Nl+6HMH&Oi~Q-%2vz-=tTLY zoew2)#&}9>bV3ZF_GV&XxRH%lLlNlcT#2tf3bmAUXw6cYH+tKpilfJ)Z(H2MzulV= zJ^a-!{kn$@Rx?N5F`V`kI@RMag5aL**Mbk!IOe=Wa24-2jjN#5Bf0Lh;>%CoMkK*! zn-$``<0Gj3)eWgI8>}lDCu=&nHfQcx_KT-^IzyIfS37YyO9H0B^sh$SF}U}i0bW{2 z_L4X_Kg((}W>@Vaw?90qynGoE{9(=-4KikSKYqRIrnW5Q!Fv$+Y!VuRZH+byBi@lJfy6}B@t#8Qi>>%4$#K zQT9(+RT*)OK^TI%ZyU3xG^It=Cg#|>;r2r=n#=@8G8*Ac=1&|`9vBPC6b&rF^rWr8 zb#*yOobd^%*4WK(G)>~ku~(xt%Zm{zcSeYrw{-}^Ak)jwUvlMb>GO}y=ScA>Fhme-5qrXP!P7yV=hPC1;w_5Hh(ZR19l2<7mD{a~92MHsWAi4sk>6 zb_hhzc|AP)VIMTH^gvvytJI;WSK!@|96xpSxdA9KcA1}K={Q1?tZU`bodzbTtX_-*6sONea81Qm@vbKeTpBX zeD80{8;t@T*c#|o>m(3YZDOm1KAvI zcw<$yJpI5dmVb%gk*L%?J@S%;1{1H#K1qM8gskok>v4|+b0M=3`r#z!XPk^9Z-{<+ z{aI$FkLz`e*Ek>@@t256V0|Wd6Fv+!4ovL3A+r$&lD=Gks~)CaBW(JmF#qSEiMC_@p1VJliAXBjt1U|v;}$MmQ-TY(YvDX63SN)DZp@p6N-f~ zIU7cCZcHO8%tSw&a3BV0Lcg}#jdD8%_-43kJ@knQcS>1f53K|#ou=*JcEYb* z-D6keh*(a|11JnURL>jaI|9Rnuc1u|$*Aj&gr1mem+^v)NkOUC;*KUKgqGzeqth_BWsA$p&rRSb81S-jWfJeGQ^+i>_0?2W6}E z<38{D`>Mj>>0I8BXUj>0C~qum6m-w}*;C#FW^Y|jL_`Zpz3SO0iaS!5J7WA#41n6B zX}kcg;BwhMvmcCqA*WH_cI4>&(NmZ|y?=%0F1#N>-lF4>>dO{DXD8b74)(hGgOsmK zFbML6_)X?FLEg&mK&(4WkgX{XGVZO@nAPxAlzSh0?f01PEZt_+{gV=S2Fw}<^$o}Y zEFAml2guzHc7u2lC?9rjV2&!k`po%)JYxm-^$+~;nHBcQ~jXhF4lp^rx{-Q=QA zLK4@SI71OEK>=vVzlnLB)wUx|UHIcB<)5^+Llh4+a*|LA4F$;1pWCm;LoN~AHsTSaAk%_= z77+Ozq-dh&1}>Wf3cS5IV?%pU;zpYL2lBz|=ZHn!dLrnCqGFIr5{AU{b@Z7Z*5$kW z7&}8!%2LHsY0UpKtlwBsvE1g9xw1L#qT}cC*2>Qz!++=b^9ySN zg%l9${;mddb1>M3e*ORzd-sdEqe}D9^u15Z52AA)!UutU<`y=a8&>XVwH;z!eX9G6Lz6sWaw? zJ34}RV1+1YVL}es%(>Z!5#>ojvg`P`mo_EZcn*rgN14~p1;8~dXF#?m*N4V$&cDmX z3_?VkXCyE%ZQTED*@*UM*{EvlVeMe4X60gTZ1&$<@~V@rvc~AYa}OyxqBbJbT2j-f z$fMM#qkGFG;cGO5E0EfHG{f#FT(i|Cu@Bf|fgj*_rpCtRrSUix^$iUTjjgT5j-O^a zItW<_Ni(lJXRdrt?sJp7KW^^013k<{tb|x1y_*rLF|595VfDYDzFA>43O5%=e~xZ>eNm>b4U~aBxGHFC@qTvlHmmV) z=~0qCg;?3NBDgS2<$Hnc_~=}rL%4BY<*(I3pTwur#jLFTf)UMUR!bdFD+4^Pw~B{z z;GgbA2AVV4zWZkzXuc6a-Xl*~q%>5sOIsb9{l3PiqxKhLHtZ#)i+;bn;`)`GY(DTY zkl3xxR%1eR)yj}2^A3a=EibZQHorTuAFTZCEs9lFnint|7>~mE>1HpNJBjmntlakG zg2`K`yE-+Nekx96k8w6B1D2em>6$F5>6)UuNeRj~%JLe8eVUXB@gAPn#a7`LSQR-H zThP~BNpktZ@KPm3tokH|#uc043395T-{{s?rY10zX4#TV_*p{`$J;nouH|r=9|h`t zO7TCJs(%<0AAlMqSHH1NG=BfaI-`cy;oulA>yy2C7QuB2<3`mIoxM-YQ-WvgVv}0x z(jo3zo+`7#zxZc6iAI5w4N{zYy zCXG7b__;yD=#N-;hEsP2S$9T_x*;-Z1&FtS!Y>?8k+r`aR}ty2`{tie{^Qj7 zhZpBRY5zKj{8gC#iQ+%+@Q3zqdeeWh|Mg4$ooN1v4U+%gw4)>o4f8h!=1*||2LnT= I_ Date: Fri, 26 May 2017 14:36:26 -0500 Subject: [PATCH 28/80] Removes Fastload.dmm --- _maps/map_files/generic/Fastload.dmm | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 _maps/map_files/generic/Fastload.dmm diff --git a/_maps/map_files/generic/Fastload.dmm b/_maps/map_files/generic/Fastload.dmm deleted file mode 100644 index 96b4a26934..0000000000 --- a/_maps/map_files/generic/Fastload.dmm +++ /dev/null @@ -1,3 +0,0 @@ -"a" = () - -(1,1,1, 1,1,1) = {""} From 93c19d0e4b05acb7094fcc66dd206e6af9aec934 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 14:41:35 -0500 Subject: [PATCH 29/80] Replaces parentcommit with originmastercommit --- code/datums/helper_datums/getrev.dm | 31 ++++++++++++++++------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index b90e2ec652..2e95629d30 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -1,34 +1,37 @@ /datum/getrev - var/parentcommit + var/originmastercommit var/commit var/list/testmerge = list() var/has_pr_details = FALSE //example data in a testmerge entry when this is true: https://api.github.com/repositories/3234987/pulls/22586 var/date /datum/getrev/New() - var/head_file = file2text(".git/logs/HEAD") if(SERVERTOOLS && fexists("..\\prtestjob.lk")) var/list/tmp = world.file2list("..\\prtestjob.lk") for(var/I in tmp) if(I) testmerge |= I - var/testlen = max(testmerge.len - 1, 0) - var/regex/head_log = new("(\\w{40}) .+> (\\d{10}).+(?=(\n.*(\\w{40}).*){[testlen]}\n*\\Z)") - head_log.Find(head_file) - parentcommit = head_log.group[1] - date = unix2date(text2num(head_log.group[2])) - commit = head_log.group[4] + log_world("Running /tg/ revision:") - log_world("[date]") + var/list/logs = world.file2list(".git/logs/HEAD") + if(logs) + logs = splittext(logs[logs.len - 1], " ") + date = unix2date(text2num(logs[5])) + commit = logs[2] + log_world("[date]") + logs = world.file2list(".git/logs/refs/remotes/origin/master") + if(logs) + originmastercommit = splittext(logs[logs.len - 1], " ")[2] + if(testmerge.len) log_world(commit) for(var/line in testmerge) if(line) log_world("Test merge active of PR #[line]") SSblackbox.add_details("testmerged_prs","[line]") - log_world("Based off master commit [parentcommit]") + log_world("Based off origin/master commit [originmastercommit]") else - log_world(parentcommit) + log_world(originmastercommit) /datum/getrev/proc/DownloadPRDetails() if(!config.githubrepoid) @@ -73,13 +76,13 @@ set name = "Show Server Revision" set desc = "Check the current server code revision" - if(GLOB.revdata.parentcommit) + if(GLOB.revdata.originmastercommit) to_chat(src, "Server revision compiled on: [GLOB.revdata.date]") var/prefix = "" if(GLOB.revdata.testmerge.len) to_chat(src, GLOB.revdata.GetTestMergeInfo()) - prefix = "Based off master commit: " - var/pc = GLOB.revdata.parentcommit + prefix = "Based off origin/master commit: " + var/pc = GLOB.revdata.originmastercommit to_chat(src, "[prefix][copytext(pc, 1, min(length(pc), 7))]") else to_chat(src, "Revision unknown") From 25059558cb6f83bdcf3870b2ca6157cea8e91533 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 26 May 2017 15:26:08 -0500 Subject: [PATCH 30/80] admin related shit --- code/modules/admin/admin.dm | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index f8329b1f69..fdc18652d0 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -37,7 +37,7 @@ body += " \[Heal\] " if(M.client) - body += "
\[Player Age: [M.client.player_age]\]\[Byond Age: [M.client.account_age]\]" + body += "
\[First Seen: [M.client.player_join_date]\]\[Byond account registered on: [M.client.account_join_date]\]" body += "
Show related accounts by: " body += "\[ CID | " body += "IP \]" @@ -48,7 +48,7 @@ body += "PM - " body += "SM - " body += "FLW - " - body += "LOGS\]
" + body += "LOGS\]
" body += "Mob type = [M.type]

" @@ -239,21 +239,21 @@ if(6) dat+="ERROR: Could not submit Feed story to Network.

" if(src.admincaster_feed_channel.channel_name=="") - dat+="•Invalid receiving channel name.
" + dat+="Invalid receiving channel name.
" if(src.admincaster_feed_message.returnBody(-1) == "" || src.admincaster_feed_message.returnBody(-1) == "\[REDACTED\]") - dat+="•Invalid message body.
" + dat+="Invalid message body.
" dat+="
Return
" if(7) dat+="ERROR: Could not submit Feed Channel to Network.

" if(src.admincaster_feed_channel.channel_name =="" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]") - dat+="•Invalid channel name.
" + dat+="Invalid channel name.
" var/check = 0 for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels) if(FC.channel_name == src.admincaster_feed_channel.channel_name) check = 1 break if(check) - dat+="•Channel name already in use.
" + dat+="Channel name already in use.
" dat+="
Return
" if(9) dat+="[admincaster_feed_channel.channel_name]: \[created by: [admincaster_feed_channel.returnAuthor(-1)]\]
" @@ -354,9 +354,9 @@ if(16) dat+="ERROR: Wanted Issue rejected by Network.

" if(src.admincaster_wanted_message.criminal =="" || src.admincaster_wanted_message.criminal == "\[REDACTED\]") - dat+="•Invalid name for person wanted.
" + dat+="Invalid name for person wanted.
" if(src.admincaster_wanted_message.body == "" || src.admincaster_wanted_message.body == "\[REDACTED\]") - dat+="•Invalid description.
" + dat+="Invalid description.
" dat+="
Return
" if(17) dat+="Wanted Issue successfully deleted from Circulation
" @@ -419,18 +419,18 @@ set desc="Restarts the world immediately" if (!usr.client.holder) return - - var/list/options = list("Regular Restart", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)") - var result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options - if(result) + + var/list/options = list("Regular Restart", "Hard Restart (No Delay/Feeback Reason)", "Hardest Restart (No actions, just reboot)") + var result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options + if(result) SSblackbox.add_details("admin_verb","Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - switch(result) - if("Regular Restart") - SSticker.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10) - if("Hard Restart (No Delay, No Feeback Reason)") - world.Reboot() - if("Hardest Restart (No actions, just reboot)") - world.Reboot(fast_track = TRUE) + switch(result) + if("Regular Restart") + SSticker.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10) + if("Hard Restart (No Delay, No Feeback Reason)") + world.Reboot() + if("Hardest Restart (No actions, just reboot)") + world.Reboot(fast_track = TRUE) /datum/admins/proc/end_round() set category = "Server" From 04df45c9075f56bde888f29c600052a956102b75 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 18:02:13 -0500 Subject: [PATCH 31/80] Ports defibs to Initialize --- code/game/objects/items/weapons/defib.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index f251cbabab..4bdf6ddf3c 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -23,14 +23,14 @@ var/combat = 0 //can we revive through space suits? var/grab_ghost = FALSE // Do we pull the ghost back into their body? -/obj/item/weapon/defibrillator/New() //starts without a cell for rnd - ..() +/obj/item/weapon/defibrillator/Initialize() //starts without a cell for rnd + . = ..() paddles = make_paddles() update_icon() return -/obj/item/weapon/defibrillator/loaded/New() //starts with hicap - ..() +/obj/item/weapon/defibrillator/loaded/Initialize() //starts with hicap + . = ..() paddles = make_paddles() bcell = new(src) update_icon() @@ -237,8 +237,8 @@ if(slot == user.getBeltSlot()) return 1 -/obj/item/weapon/defibrillator/compact/loaded/New() - ..() +/obj/item/weapon/defibrillator/compact/loaded/Initialize() + . = ..() paddles = make_paddles() bcell = new(src) update_icon() @@ -249,8 +249,8 @@ combat = 1 safety = 0 -/obj/item/weapon/defibrillator/compact/combat/loaded/New() - ..() +/obj/item/weapon/defibrillator/compact/combat/loaded/Initialize() + . = ..() paddles = make_paddles() bcell = new /obj/item/weapon/stock_parts/cell/infinite(src) update_icon() From 0e40cd7f6d28d68d97bea997d775d2a8e4b92cf1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 18:03:17 -0500 Subject: [PATCH 32/80] Ports stunbatons to Initialize --- code/game/objects/items/weapons/stunbaton.dm | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 5393f40ec6..c1b932d1bc 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -21,10 +21,9 @@ user.visible_message("[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!") return (FIRELOSS) -/obj/item/weapon/melee/baton/New() - ..() +/obj/item/weapon/melee/baton/Initialize() + . = ..() update_icon() - return /obj/item/weapon/melee/baton/throw_impact(atom/hit_atom) ..() @@ -32,10 +31,9 @@ if(status && prob(throw_hit_chance) && iscarbon(hit_atom)) baton_stun(hit_atom) -/obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed. - ..() +/obj/item/weapon/melee/baton/loaded/Initialize() //this one starts with a cell pre-installed. bcell = new(src) - update_icon() + . = ..() /obj/item/weapon/melee/baton/proc/deductcharge(chrgdeductamt) if(bcell) @@ -188,8 +186,8 @@ slot_flags = SLOT_BACK var/obj/item/device/assembly/igniter/sparkler = 0 -/obj/item/weapon/melee/baton/cattleprod/New() - ..() +/obj/item/weapon/melee/baton/cattleprod/Initialize() + . = ..() sparkler = new (src) /obj/item/weapon/melee/baton/cattleprod/baton_stun() From 15482314d43044a8aa591236318757f1932bd716 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 18:03:21 -0500 Subject: [PATCH 33/80] Makes a thing use QDEL_NULL --- code/game/machinery/doors/airlock.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 1750aa7aa8..020f7aa309 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -204,9 +204,7 @@ if(charge) qdel(charge) charge = null - if(electronics) - qdel(electronics) - electronics = null + QDEL_NULL(electronics) if (cyclelinkedairlock) if (cyclelinkedairlock.cyclelinkedairlock == src) cyclelinkedairlock.cyclelinkedairlock = null From b977d6989de28600cf31c6af46039458eb3ed73d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 18:04:26 -0500 Subject: [PATCH 34/80] Makes shades/constructs able to speak galcommon again --- code/modules/language/language_holder.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index 918f179591..a649041e01 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -107,7 +107,6 @@ /datum/language_holder/construct languages = list(/datum/language/common, /datum/language/narsie) - only_speaks_language = /datum/language/narsie /datum/language_holder/drone languages = list(/datum/language/common, /datum/language/drone, /datum/language/machine) From b089a14c536e35b1b1343128e42d551d3dd6b450 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 19:06:39 -0500 Subject: [PATCH 35/80] Ports guns to Initialize --- .../objects/items/weapons/chrono_eraser.dm | 6 +++--- .../mission_code/stationCollision.dm | 8 ++++---- code/modules/clothing/chameleon.dm | 4 ++-- code/modules/projectiles/gun.dm | 4 ++-- code/modules/projectiles/guns/ballistic.dm | 4 ++-- .../projectiles/guns/ballistic/automatic.dm | 19 ++++++++---------- .../guns/ballistic/laser_gatling.dm | 20 +++++++++---------- .../projectiles/guns/ballistic/revolver.dm | 16 +++++++-------- .../projectiles/guns/ballistic/shotgun.dm | 8 ++++---- .../modules/projectiles/guns/ballistic/toy.dm | 4 ++-- code/modules/projectiles/guns/energy.dm | 4 ++-- .../projectiles/guns/energy/energy_gun.dm | 4 ++-- .../guns/energy/kinetic_accelerator.dm | 2 +- code/modules/projectiles/guns/energy/pulse.dm | 4 ++-- code/modules/projectiles/guns/magic.dm | 4 ++-- code/modules/projectiles/guns/magic/wand.dm | 4 ++-- code/modules/projectiles/guns/medbeam.dm | 8 ++++---- code/modules/projectiles/guns/syringe_gun.dm | 4 ++-- 18 files changed, 62 insertions(+), 65 deletions(-) diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index e32d365298..86664404d1 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -54,10 +54,10 @@ var/obj/effect/chrono_field/field = null var/turf/startpos = null -/obj/item/weapon/gun/energy/chrono_gun/New(var/obj/item/weapon/chrono_eraser/T) +/obj/item/weapon/gun/energy/chrono_gun/Initialize() . = ..() - if(istype(T)) - TED = T + if(istype(loc, /obj/item/weapon/chrono_eraser)) + TED = loc else //admin must have spawned it TED = new(src.loc) qdel(src) diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm index fb1d375854..441d40db8f 100644 --- a/code/modules/awaymissions/mission_code/stationCollision.dm +++ b/code/modules/awaymissions/mission_code/stationCollision.dm @@ -46,8 +46,8 @@ //Syndicate sub-machine guns. /obj/item/weapon/gun/ballistic/automatic/c20r/sc_c20r -/obj/item/weapon/gun/ballistic/automatic/c20r/sc_c20r/New() - ..() +/obj/item/weapon/gun/ballistic/automatic/c20r/sc_c20r/Initialize() + . = ..() for(var/ammo in magazine.stored_ammo) if(prob(95)) //95% chance magazine.stored_ammo -= ammo @@ -55,8 +55,8 @@ //Barman's shotgun /obj/item/weapon/gun/ballistic/shotgun/sc_pump -/obj/item/weapon/gun/ballistic/shotgun/sc_pump/New() - ..() +/obj/item/weapon/gun/ballistic/shotgun/sc_pump/Initialize() + . = ..() for(var/ammo in magazine.stored_ammo) if(prob(95)) //95% chance magazine.stored_ammo -= ammo diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 0de56aa86a..3a91c3207e 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -420,8 +420,8 @@ var/badmin_mode = FALSE var/static/list/blacklisted_vars = list("locs", "loc", "contents", "x", "y", "z") -/obj/item/weapon/gun/energy/laser/chameleon/New() - ..() +/obj/item/weapon/gun/energy/laser/chameleon/Initialize() + . = ..() chameleon_action = new(src) chameleon_action.chameleon_type = /obj/item/weapon/gun chameleon_action.chameleon_name = "Gun" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 2dffe0a567..6fb4e6276f 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -60,8 +60,8 @@ var/datum/action/toggle_scope_zoom/azoom -/obj/item/weapon/gun/New() - ..() +/obj/item/weapon/gun/Initialize() + . = ..() if(pin) pin = new pin(src) if(gun_light) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index a7a8b75da2..80be30a06a 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -9,8 +9,8 @@ var/obj/item/ammo_box/magazine/magazine var/casing_ejector = 1 //whether the gun ejects the chambered casing -/obj/item/weapon/gun/ballistic/New() - ..() +/obj/item/weapon/gun/ballistic/Initialize() + . = ..() if(!spawnwithmagazine) update_icon() return diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 2f7036cab8..70d399b107 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -99,10 +99,9 @@ /obj/item/weapon/gun/ballistic/automatic/c20r/unrestricted pin = /obj/item/device/firing_pin -/obj/item/weapon/gun/ballistic/automatic/c20r/New() - ..() +/obj/item/weapon/gun/ballistic/automatic/c20r/Initialize() + . = ..() update_icon() - return /obj/item/weapon/gun/ballistic/automatic/c20r/afterattack() ..() @@ -150,20 +149,18 @@ fire_delay = 2 pin = /obj/item/device/firing_pin/implant/pindicate -/obj/item/weapon/gun/ballistic/automatic/m90/New() - ..() +/obj/item/weapon/gun/ballistic/automatic/m90/Initialize() + . = ..() underbarrel = new /obj/item/weapon/gun/ballistic/revolver/grenadelauncher(src) update_icon() - return /obj/item/weapon/gun/ballistic/automatic/m90/unrestricted pin = /obj/item/device/firing_pin -/obj/item/weapon/gun/ballistic/automatic/m90/unrestricted/New() - ..() +/obj/item/weapon/gun/ballistic/automatic/m90/unrestricted/Initialize() + . = ..() underbarrel = new /obj/item/weapon/gun/ballistic/revolver/grenadelauncher/unrestricted(src) update_icon() - return /obj/item/weapon/gun/ballistic/automatic/m90/afterattack(atom/target, mob/living/user, flag, params) if(select == 2) @@ -259,8 +256,8 @@ /obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/unrestricted pin = /obj/item/device/firing_pin -/obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/New() - ..() +/obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/Initialize() + . = ..() update_icon() /obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/update_icon() diff --git a/code/modules/projectiles/guns/ballistic/laser_gatling.dm b/code/modules/projectiles/guns/ballistic/laser_gatling.dm index bc0668cd66..a246871e61 100644 --- a/code/modules/projectiles/guns/ballistic/laser_gatling.dm +++ b/code/modules/projectiles/guns/ballistic/laser_gatling.dm @@ -9,16 +9,16 @@ item_state = "backpack" slot_flags = SLOT_BACK w_class = WEIGHT_CLASS_HUGE - var/obj/item/weapon/gun/ballistic/minigun/gun = null + var/obj/item/weapon/gun/ballistic/minigun/gun var/armed = 0 //whether the gun is attached, 0 is attached, 1 is the gun is wielded. var/overheat = 0 var/overheat_max = 40 var/heat_diffusion = 1 -/obj/item/weapon/minigunpack/New() +/obj/item/weapon/minigunpack/Initialize() + . = ..() gun = new(src) START_PROCESSING(SSobj, src) - ..() /obj/item/weapon/minigunpack/Destroy() STOP_PROCESSING(SSobj, src) @@ -110,15 +110,15 @@ casing_ejector = 0 var/obj/item/weapon/minigunpack/ammo_pack -/obj/item/weapon/gun/ballistic/minigun/New() +/obj/item/weapon/gun/ballistic/minigun/Initialize() SET_SECONDARY_FLAG(src, SLOWS_WHILE_IN_HAND) - if(!ammo_pack) - if(istype(loc,/obj/item/weapon/minigunpack)) //We should spawn inside a ammo pack so let's use that one. - ammo_pack = loc - ..() - else - qdel(src)//No pack, no gun + if(istype(loc, /obj/item/weapon/minigunpack)) //We should spawn inside a ammo pack so let's use that one. + ammo_pack = loc + else + return INITIALIZE_HINT_QDEL //No pack, no gun + + return ..() /obj/item/weapon/gun/ballistic/minigun/attack_self(mob/living/user) return diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 892defa9f4..2ce432bf31 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -6,8 +6,8 @@ origin_tech = "combat=3;materials=2" casing_ejector = 0 -/obj/item/weapon/gun/ballistic/revolver/New() - ..() +/obj/item/weapon/gun/ballistic/revolver/Initialize() + . = ..() if(!istype(magazine, /obj/item/ammo_box/magazine/internal/cylinder)) verbs -= /obj/item/weapon/gun/ballistic/revolver/verb/spin @@ -95,8 +95,8 @@ unique_rename = 1 unique_reskin = 1 -/obj/item/weapon/gun/ballistic/revolver/detective/New() - ..() +/obj/item/weapon/gun/ballistic/revolver/detective/Initialize() + . = ..() options["Default"] = "detective" options["Leopard Spots"] = "detective_leopard" options["Black Panther"] = "detective_panther" @@ -177,8 +177,8 @@ mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rus357 var/spun = FALSE -/obj/item/weapon/gun/ballistic/revolver/russian/New() - ..() +/obj/item/weapon/gun/ballistic/revolver/russian/Initialize() + . = ..() do_spin() spun = TRUE update_icon() @@ -271,8 +271,8 @@ unique_rename = 1 unique_reskin = 1 -/obj/item/weapon/gun/ballistic/revolver/doublebarrel/New() - ..() +/obj/item/weapon/gun/ballistic/revolver/doublebarrel/Initialize() + . = ..() options["Default"] = "dshotgun" options["Dark Red Finish"] = "dshotgun-d" options["Ash"] = "dshotgun-f" diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 918acd27a1..6fc3fd3687 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -147,8 +147,8 @@ mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage -/obj/item/weapon/gun/ballistic/shotgun/boltaction/enchanted/New() - ..() +/obj/item/weapon/gun/ballistic/shotgun/boltaction/enchanted/Initialize() + . = ..() bolt_open = 1 pump() gun_type = type @@ -213,8 +213,8 @@ var/toggled = 0 var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine -/obj/item/weapon/gun/ballistic/shotgun/automatic/dual_tube/New() - ..() +/obj/item/weapon/gun/ballistic/shotgun/automatic/dual_tube/Initialize() + . = ..() if (!alternate_magazine) alternate_magazine = new mag_type(src) diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 89f6655d8e..9b8044dac8 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -35,9 +35,9 @@ /obj/item/weapon/gun/ballistic/automatic/toy/pistol/riot mag_type = /obj/item/ammo_box/magazine/toy/pistol/riot -/obj/item/weapon/gun/ballistic/automatic/toy/pistol/riot/New() +/obj/item/weapon/gun/ballistic/automatic/toy/pistol/riot/Initialize() magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src) - ..() + return ..() /obj/item/weapon/gun/ballistic/automatic/toy/pistol/unrestricted pin = /obj/item/device/firing_pin diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 9e642b0cef..b022941f78 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -25,8 +25,8 @@ update_icon() -/obj/item/weapon/gun/energy/New() - ..() +/obj/item/weapon/gun/energy/Initialize() + . = ..() if(cell_type) power_supply = new cell_type(src) else diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 52f9852344..a8edc727b3 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -22,9 +22,9 @@ charge_sections = 3 can_flashlight = 0 // Can't attach or detach the flashlight, and override it's icon update -/obj/item/weapon/gun/energy/e_gun/mini/New() +/obj/item/weapon/gun/energy/e_gun/mini/Initialize() gun_light = new /obj/item/device/flashlight/seclite(src) - ..() + return ..() /obj/item/weapon/gun/energy/e_gun/mini/update_icon() ..() diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 0f108fcc76..e8d48373da 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -68,7 +68,7 @@ unique_frequency = TRUE max_mod_capacity = 80 -/obj/item/weapon/gun/energy/kinetic_accelerator/New() +/obj/item/weapon/gun/energy/kinetic_accelerator/Initialize() . = ..() if(!holds_charge) empty() diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index b3e55f2423..43431a65c3 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -17,9 +17,9 @@ /obj/item/weapon/gun/energy/pulse/prize pin = /obj/item/device/firing_pin -/obj/item/weapon/gun/energy/pulse/prize/New() +/obj/item/weapon/gun/energy/pulse/prize/Initialize() . = ..() - GLOB.poi_list |= src + GLOB.poi_list += src var/msg = "A pulse rifle prize has been created at [ADMIN_COORDJMP(src)]" message_admins(msg) diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 58a756a28d..9c30eefd2f 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -44,8 +44,8 @@ charges--//... drain a charge recharge_newshot() -/obj/item/weapon/gun/magic/New() - ..() +/obj/item/weapon/gun/magic/Initialize() + . = ..() charges = max_charges chambered = new ammo_type(src) if(can_charge) diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index fe93a58838..247273e3f4 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -9,13 +9,13 @@ max_charges = 100 //100, 50, 50, 34 (max charge distribution by 25%ths) var/variable_charges = 1 -/obj/item/weapon/gun/magic/wand/New() +/obj/item/weapon/gun/magic/wand/Initialize() if(prob(75) && variable_charges) //25% chance of listed max charges, 50% chance of 1/2 max charges, 25% chance of 1/3 max charges if(prob(33)) max_charges = Ceiling(max_charges / 3) else max_charges = Ceiling(max_charges / 2) - ..() + return ..() /obj/item/weapon/gun/magic/wand/examine(mob/user) ..() diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index 37d576a8ff..46758f8889 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -16,8 +16,8 @@ weapon_weight = WEAPON_MEDIUM -/obj/item/weapon/gun/medbeam/New() - ..() +/obj/item/weapon/gun/medbeam/Initialize() + . = ..() START_PROCESSING(SSobj, src) /obj/item/weapon/gun/medbeam/Destroy(mob/user) @@ -128,6 +128,6 @@ /obj/item/weapon/gun/medbeam/mech mounted = 1 -/obj/item/weapon/gun/medbeam/mech/New() - ..() +/obj/item/weapon/gun/medbeam/mech/Initialize() + . = ..() STOP_PROCESSING(SSobj, src) //Mech mediguns do not process until installed, and are controlled by the holder obj diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm index 09547b0d98..2e8a29cded 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -14,8 +14,8 @@ var/list/syringes = list() var/max_syringes = 1 -/obj/item/weapon/gun/syringe/New() - ..() +/obj/item/weapon/gun/syringe/Initialize() + . = ..() chambered = new /obj/item/ammo_casing/syringegun(src) /obj/item/weapon/gun/syringe/recharge_newshot() From e3e040fee0646b14f7f417e5c0a46f261045bf65 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 19:41:20 -0500 Subject: [PATCH 36/80] Fixes pre-round-start logs --- code/world.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/world.dm b/code/world.dm index 566c9e213c..df083571c4 100644 --- a/code/world.dm +++ b/code/world.dm @@ -18,7 +18,7 @@ SetupExternalRSC() - GLOB.config_error_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl + GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) From 4ffca03a530fb9c9a8909efb2af7faa2c1121f03 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 23:04:25 -0500 Subject: [PATCH 37/80] Automatic changelog generation for PR #1210 [ci skip] --- html/changelogs/AutoChangeLog-pr-1210.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1210.yml diff --git a/html/changelogs/AutoChangeLog-pr-1210.yml b/html/changelogs/AutoChangeLog-pr-1210.yml new file mode 100644 index 0000000000..4dd2b1de7d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1210.yml @@ -0,0 +1,4 @@ +author: "Kor" +delete-after: True +changes: + - bugfix: "The chaplains possessed blade, shades, and constructs, can once again speak galactic common." From 4680f045ffa61ba648e055457e93d0c1e28fb81c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 23:22:32 -0500 Subject: [PATCH 38/80] Automatic changelog generation for PR #1195 [ci skip] --- html/changelogs/AutoChangeLog-pr-1195.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1195.yml diff --git a/html/changelogs/AutoChangeLog-pr-1195.yml b/html/changelogs/AutoChangeLog-pr-1195.yml new file mode 100644 index 0000000000..0a5716bcb7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1195.yml @@ -0,0 +1,6 @@ +author: "Moonlighting Mac says" +delete-after: True +changes: + - rscadd: "You can now craft a strong cloak with a hood made out of goliath and monster materials from within the primitive crafting screen." + - rscadd: "The cloak has a suit slot for all kind of primitive supplies, however it cannot carry most electronic miner equipment. +balance: Due to the recipe requiring leather, it is not normally accessible to all ghost roles without a source of water & electricity." From 2fbcba23557ef6159ec4a33187c936d623b28856 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 23:23:48 -0500 Subject: [PATCH 39/80] Automatic changelog generation for PR #1183 [ci skip] --- html/changelogs/AutoChangeLog-pr-1183.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1183.yml diff --git a/html/changelogs/AutoChangeLog-pr-1183.yml b/html/changelogs/AutoChangeLog-pr-1183.yml new file mode 100644 index 0000000000..4a627f949b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1183.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "20% of internal affairs agents are actually traitors" From 83971cf8fb06f4b19e78511ffee766987ae98ef9 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 26 May 2017 23:24:09 -0500 Subject: [PATCH 40/80] Automatic changelog generation for PR #1182 [ci skip] --- html/changelogs/AutoChangeLog-pr-1182.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1182.yml diff --git a/html/changelogs/AutoChangeLog-pr-1182.yml b/html/changelogs/AutoChangeLog-pr-1182.yml new file mode 100644 index 0000000000..a2c7d10876 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1182.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - spellcheck: "typo fix for origin tech" From 127a9ff6d41d66c56d06cec7d4394db89e29195c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:26:50 -0500 Subject: [PATCH 41/80] Vapes are tiny (#1231) --- code/game/objects/items/weapons/cigs_lighters.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 82229bb7cf..86bbb340b1 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -622,6 +622,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon = 'icons/obj/clothing/masks.dmi' icon_state = null item_state = null + w_class = WEIGHT_CLASS_TINY var/chem_volume = 100 var/vapetime = 0 //this so it won't puff out clouds every tick var/screw = 0 // kinky From 63ac84ab6d9be6d2bfc40c12baea238d9814cae6 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:26:51 -0500 Subject: [PATCH 42/80] Automatic changelog generation for PR #1231 [ci skip] --- html/changelogs/AutoChangeLog-pr-1231.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1231.yml diff --git a/html/changelogs/AutoChangeLog-pr-1231.yml b/html/changelogs/AutoChangeLog-pr-1231.yml new file mode 100644 index 0000000000..7fad1ab274 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1231.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "E-Cigarettes can now fit in your pocket." From c9ab875da92896f4162f878341b57e24a512da0a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:26:59 -0500 Subject: [PATCH 43/80] Ports clonepods to Initialize (#1230) --- code/game/machinery/cloning.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index ec87cf6ba9..6df194cf25 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -44,8 +44,8 @@ "corazone", // prevents cardiac arrest damage "mimesbane") // stops them gasping from lack of air. -/obj/machinery/clonepod/New() - ..() +/obj/machinery/clonepod/Initialize() + . = ..() var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/clonepod(null) B.apply_default_parts(src) From 6c1159bf856ac7c470002fb96c439ed0312a55cb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:27:33 -0500 Subject: [PATCH 44/80] Puts the Viruses back in the viro fridge at the syndicate base. (#1229) --- .../RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index 4b50904ea2..0bc99060de 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -726,7 +726,7 @@ }, /area/ruin/powered/syndicate_lava_base) "bM" = ( -/obj/machinery/smartfridge/chemistry/virology, +/obj/machinery/smartfridge/chemistry/virology/preloaded, /turf/open/floor/plasteel/podhatch{ tag = "icon-podhatch (EAST)"; icon_state = "podhatch"; From e5f2a0962298ebb07fc371d9c098c8d1faa82334 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:27:52 -0500 Subject: [PATCH 45/80] Pixel projectile ricochets and reflections! (#1220) --- code/__DEFINES/flags.dm | 2 ++ code/__HELPERS/maths.dm | 18 ++++++++++++++++-- code/game/atoms.dm | 3 +++ code/game/turfs/closed.dm | 3 --- .../turfs/simulated/wall/mineral_walls.dm | 1 + code/game/turfs/simulated/walls.dm | 14 ++++++++++++++ code/modules/projectiles/projectile.dm | 19 ++++++++++++++++++- code/modules/projectiles/projectile/beams.dm | 4 +++- 8 files changed, 57 insertions(+), 7 deletions(-) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index a5e69bdc7b..e443e57b14 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -14,6 +14,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby() #define MASKINTERNALS 8 // mask allows internals #define HEAR 16 // This flag is what recursive_hear_check() uses to determine wether to add an item to the hearer list or not. +#define CHECK_RICOCHET 32 // Projectiels will check ricochet on things impacted that have this. #define CONDUCT 64 // conducts electricity (metal etc.) #define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way #define NODECONSTRUCT 128 // For machines and structures that should not break into parts, eg, holodeck stuff @@ -57,6 +58,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define UNUSED_TRANSIT_TURF 2 #define CAN_BE_DIRTY 4 //If a turf can be made dirty at roundstart. This is also used in areas. #define NO_DEATHRATTLE 16 // Do not notify deadchat about any deaths that occur on this turf. +//#define CHECK_RICOCHET 32 //Same thing as atom flag. /* These defines are used specifically with the atom/pass_flags bitmask diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 7e892e8dd4..7e0fd531eb 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -130,6 +130,22 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, var/t = round((val - min) / d) return val - (t * d) +#define NORM_ROT(rot) ((((rot % 360) + (rot - round(rot, 1))) > 0) ? ((rot % 360) + (rot - round(rot, 1))) : (((rot % 360) + (rot - round(rot, 1))) + 360)) + +/proc/get_angle_of_incidence(face_angle, angle_in, auto_normalize = TRUE) + + var/angle_in_s = NORM_ROT(angle_in) + var/face_angle_s = NORM_ROT(face_angle) + var/incidence = face_angle_s - angle_in_s + var/incidence_s = incidence + while(incidence_s < -90) + incidence_s += 180 + while(incidence_s > 90) + incidence_s -= 180 + if(auto_normalize) + return incidence_s + else + return incidence //A logarithm that converts an integer to a number scaled between 0 and 1 (can be tweaked to be higher). //Currently, this is used for hydroponics-produce sprite transforming, but could be useful for other transform functions. @@ -141,8 +157,6 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, return size_factor + scaling_modifier //scale mod of 0 results in a number from 0 to 1. A scale modifier of +0.5 returns 0.5 to 1.5 //to_chat(world, "Transform multiplier of [src] is [size_factor + scaling_modifer]") - - //converts a uniform distributed random number into a normal distributed one //since this method produces two random numbers, one is saved for subsequent calls //(making the cost negligble for every second call) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 4a0f05602b..65d4cf1449 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -104,6 +104,9 @@ return ..() +/atom/proc/handle_ricochet(obj/item/projectile/P) + return + /atom/proc/CanPass(atom/movable/mover, turf/target, height=1.5) return (!density || !height) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 741d4f2958..2c3e60694d 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -24,9 +24,6 @@ /turf/closed/indestructible/oldshuttle/corner icon_state = "corner" - - - /turf/closed/indestructible/splashscreen name = "Space Station 13" icon = 'config/title_screens/images/blank.png' diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index b78099c6bb..2cfb32f6dc 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -175,6 +175,7 @@ desc = "A light-weight titanium wall used in shuttles." icon = 'icons/turf/walls/shuttle_wall.dmi' icon_state = "map-shuttle" + flags = CAN_BE_DIRTY | CHECK_RICOCHET sheet_type = /obj/item/stack/sheet/mineral/titanium smooth = SMOOTH_MORE|SMOOTH_DIAGONAL canSmoothWith = list(/turf/closed/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock/, /turf/closed/wall/shuttle, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater, /obj/structure/falsewall/titanium) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 068dd0f218..44dc1afee7 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -28,6 +28,20 @@ /turf/closed/wall/attack_tk() return +/turf/closed/wall/handle_ricochet(obj/item/projectile/P) //A huge pile of shitcode! + var/turf/p_turf = get_turf(P) + var/face_direction = get_dir(src, p_turf) + var/face_angle = dir2angle(face_direction) + var/incidence_s = get_angle_of_incidence(face_angle, P.Angle) + var/new_angle = face_angle + incidence_s + var/new_angle_s = new_angle + while(new_angle_s > 180) // Translate to regular projectile degrees + new_angle_s -= 360 + while(new_angle_s < -180) + new_angle_s += 360 + P.Angle = new_angle_s + return TRUE + /turf/closed/wall/proc/dismantle_wall(devastated=0, explode=0) if(devastated) devastate_wall() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 3dbadc85c5..8c810155db 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -28,6 +28,9 @@ var/spread = 0 //amount (in degrees) of projectile spread var/legacy = 0 //legacy projectile system animate_movement = 0 //Use SLIDE_STEPS in conjunction with legacy + var/ricochets = 0 + var/ricochets_max = 2 + var/ricochet_chance = 30 var/damage = 10 var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here @@ -132,7 +135,11 @@ /obj/item/projectile/Bump(atom/A, yes) if(!yes) //prevents double bumps. return - if(firer) + if(check_ricochet() && check_ricochet_flag(A) && ricochets < ricochets_max) + ricochets++ + if(A.handle_ricochet(src)) + return FALSE + if(firer && !ricochets) if(A == firer || (A == firer.loc && istype(A, /obj/mecha))) //cannot shoot yourself or your mech loc = A.loc return 0 @@ -166,6 +173,16 @@ picked_mob.bullet_act(src, def_zone) qdel(src) +/obj/item/projectile/proc/check_ricochet() + if(prob(ricochet_chance)) + return TRUE + return FALSE + +/obj/item/projectile/proc/check_ricochet_flag(atom/A) + if(A.flags & CHECK_RICOCHET) + return TRUE + return FALSE + /obj/item/projectile/Process_Spacemove(var/movement_dir = 0) return 1 //Bullets don't drift in space diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 766d8b5e39..427f590ba5 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -11,7 +11,9 @@ eyeblur = 2 impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser light_color = LIGHT_COLOR_RED - + ricochets_max = 50 //Honk! + ricochet_chance = 80 + /obj/item/projectile/beam/laser /obj/item/projectile/beam/laser/heavylaser From 06234fa915aa5f4a71a1dfd4fc168c3d07ff867c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:27:53 -0500 Subject: [PATCH 46/80] Automatic changelog generation for PR #1220 [ci skip] --- html/changelogs/AutoChangeLog-pr-1220.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1220.yml diff --git a/html/changelogs/AutoChangeLog-pr-1220.yml b/html/changelogs/AutoChangeLog-pr-1220.yml new file mode 100644 index 0000000000..a9590654e2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1220.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Nanotrasen's new titanium wall blueprints are smooth enough that it can reflect projectiles!" From 9288106128a3dea2b1dd2877f15869a43af67e1c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:29:32 -0500 Subject: [PATCH 47/80] Fixes monkeys having two Initializes and not returning a hint (#1188) --- code/modules/mob/living/carbon/monkey/monkey.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index a05614fe09..f6f7665ae8 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -31,10 +31,8 @@ create_internal_organs() - ..() + . = ..() -/mob/living/carbon/monkey/Initialize() - ..() create_dna(src) dna.initialize_dna(random_blood_type()) From 51dd042af54100599385cbc8e6bae946b512395c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:30:25 -0500 Subject: [PATCH 48/80] Necropolis tendrils glow again (#1228) --- .../simple_animal/hostile/mining_mobs.dm | 57 ++++++++++++------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index eaabcf5980..97fa07b5be 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -1037,6 +1037,11 @@ regenerate_icons() //Nests +/obj/effect/light_emitter/tendril + set_luminosity = 4 + set_cap = 2.5 + light_color = LIGHT_COLOR_LAVA + /mob/living/simple_animal/hostile/spawner/lavaland name = "necropolis tendril" desc = "A vile tendril of corruption, originating deep underground. Terrible monsters are pouring out of it." @@ -1046,7 +1051,6 @@ icon_dead = "tendril" faction = list("mining") weather_immunities = list("lava","ash") - luminosity = 1 health = 250 maxHealth = 250 max_mobs = 3 @@ -1059,9 +1063,17 @@ loot = list(/obj/effect/collapse, /obj/structure/closet/crate/necropolis/tendril) del_on_death = 1 var/gps = null + var/obj/effect/light_emitter/tendril/emitted_light + +/mob/living/simple_animal/hostile/spawner/lavaland/goliath + mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast + +/mob/living/simple_animal/hostile/spawner/lavaland/legion + mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion /mob/living/simple_animal/hostile/spawner/lavaland/Initialize() - ..() + . = ..() + emitted_light = new(loc) for(var/F in RANGE_TURFS(1, src)) if(ismineralturf(F)) var/turf/closed/mineral/M = F @@ -1069,7 +1081,8 @@ gps = new /obj/item/device/gps/internal(src) /mob/living/simple_animal/hostile/spawner/lavaland/Destroy() - qdel(gps) + QDEL_NULL(emitted_light) + QDEL_NULL(gps) . = ..() #define MEDAL_PREFIX "Tendril" @@ -1096,29 +1109,31 @@ /obj/effect/collapse name = "collapsing necropolis tendril" desc = "Get clear!" - luminosity = 1 - layer = ABOVE_OPEN_TURF_LAYER + layer = BELOW_OBJ_LAYER icon = 'icons/mob/nest.dmi' icon_state = "tendril" anchored = TRUE + density = TRUE + var/obj/effect/light_emitter/tendril/emitted_light -/obj/effect/collapse/New() - ..() +/obj/effect/collapse/Initialize() + . = ..() + emitted_light = new(loc) visible_message("The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!") visible_message("Something falls free of the tendril!") - playsound(get_turf(src),'sound/effects/tendril_destroyed.ogg', 200, 0, 50, 1, 1) - spawn(50) - for(var/mob/M in range(7,src)) - shake_camera(M, 15, 1) - playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, 1) - visible_message("The tendril falls inward, the ground around it widening into a yawning chasm!") - for(var/turf/T in range(2,src)) - if(!T.density) - T.TerraformTurf(/turf/open/chasm/straight_down/lava_land_surface) - qdel(src) + playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, 0, 50, 1, 1) + addtimer(CALLBACK(src, .proc/collapse), 50) -/mob/living/simple_animal/hostile/spawner/lavaland/goliath - mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast +/obj/effect/collapse/Destroy() + QDEL_NULL(emitted_light) + return ..() -/mob/living/simple_animal/hostile/spawner/lavaland/legion - mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion +/obj/effect/collapse/proc/collapse() + for(var/mob/M in range(7,src)) + shake_camera(M, 15, 1) + playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, 1) + visible_message("The tendril falls inward, the ground around it widening into a yawning chasm!") + for(var/turf/T in range(2,src)) + if(!T.density) + T.TerraformTurf(/turf/open/chasm/straight_down/lava_land_surface) + qdel(src) From a884c7efcd1f4f4762d36670bdc3d53c0c17832a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:30:26 -0500 Subject: [PATCH 49/80] Automatic changelog generation for PR #1228 [ci skip] --- html/changelogs/AutoChangeLog-pr-1228.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1228.yml diff --git a/html/changelogs/AutoChangeLog-pr-1228.yml b/html/changelogs/AutoChangeLog-pr-1228.yml new file mode 100644 index 0000000000..1b9058a75c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1228.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - bugfix: "Necropolis tendrils will once again emit light." From 3ed1975ddaee08e6e71998cbca0c35c084291196 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:31:13 -0500 Subject: [PATCH 50/80] Fixes dirty in lavaland (#1227) --- code/game/area/areas/mining.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index 48271f479d..a88816f187 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -86,6 +86,7 @@ /area/lavaland icon_state = "mining" has_gravity = 1 + flags = NONE /area/lavaland/surface name = "Lavaland" @@ -123,4 +124,4 @@ icon_state = "danger" /area/lavaland/surface/outdoors/explored - name = "Lavaland Labor Camp" \ No newline at end of file + name = "Lavaland Labor Camp" From 41ba91a2a48a3fab3a9e376761bdf65b22101ef5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:31:29 -0500 Subject: [PATCH 51/80] The Syndicate has fired their chemist and hired a replacement. (#1232) --- code/modules/paperwork/pen.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 73f4c73cfa..b6f8ee8f74 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -154,7 +154,7 @@ /obj/item/weapon/pen/sleepy/New() create_reagents(45) - reagents.add_reagent("morphine", 20) + reagents.add_reagent("chloralhydrate2", 20) reagents.add_reagent("mutetoxin", 15) reagents.add_reagent("tirizene", 10) ..() @@ -205,4 +205,4 @@ /obj/item/weapon/pen/poison/on_write(obj/item/weapon/paper/P, mob/user) P.contact_poison = "delayed_toxin" P.contact_poison_volume = 10 - add_logs(user,P,"used poison pen on") \ No newline at end of file + add_logs(user,P,"used poison pen on") From d900d20119becde9a85cc13bf2d91a1f491646a5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:31:30 -0500 Subject: [PATCH 52/80] Automatic changelog generation for PR #1232 [ci skip] --- html/changelogs/AutoChangeLog-pr-1232.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1232.yml diff --git a/html/changelogs/AutoChangeLog-pr-1232.yml b/html/changelogs/AutoChangeLog-pr-1232.yml new file mode 100644 index 0000000000..97344d4418 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1232.yml @@ -0,0 +1,4 @@ +author: "Iamgoofball" +delete-after: True +changes: + - bugfix: "After the Syndicate realized their top chemist was both mixing a stamina destroying drug with a stimulant to avoid slowdowns entirely in their sleepypens, they fired him and replaced him with a new chemist." From 7b820cf7cac649aca95d68828a6c32f131bf2ef1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:32:11 -0500 Subject: [PATCH 53/80] Fixes missing bracket in domi spawner message (#1234) --- code/game/gamemodes/gang/gang_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/gang/gang_items.dm b/code/game/gamemodes/gang/gang_items.dm index aec9b040cd..5a190d4a18 100644 --- a/code/game/gamemodes/gang/gang_items.dm +++ b/code/game/gamemodes/gang/gang_items.dm @@ -422,7 +422,7 @@ return FALSE if(dominator_excessive_walls(user)) - to_chat(user, "span class='warning'>The dominator will not function here! The dominator requires a sizable open space within three standard units so that walls do not interfere with the signal.") + to_chat(user, "The dominator will not function here! The dominator requires a sizable open space within three standard units so that walls do not interfere with the signal.") return FALSE if(!(usrarea.type in gang.territory|gang.territory_new)) From 740f1727725dd5126cdecdb12022c83781fddd4d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:32:49 -0500 Subject: [PATCH 54/80] Fixes airlocks having two Initializes (#1198) --- code/game/machinery/doors/airlock.dm | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index cd1d4de617..2175be22fe 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -97,7 +97,14 @@ var/static/list/airlock_overlays = list() /obj/machinery/door/airlock/Initialize() - ..() + . = ..() + + if (cyclelinkeddir) + cyclelinkairlock() + if(frequency) + set_frequency(frequency) + update_icon() + wires = new /datum/wires/airlock(src) if(src.closeOtherId != null) spawn (5) @@ -120,14 +127,6 @@ diag_hud.add_to_hud(src) diag_hud_set_electrified() -/obj/machinery/door/airlock/Initialize() - ..() - if (cyclelinkeddir) - cyclelinkairlock() - if(frequency) - set_frequency(frequency) - update_icon() - /obj/machinery/door/airlock/proc/cyclelinkairlock() if (cyclelinkedairlock) cyclelinkedairlock.cyclelinkedairlock = null From 8a3cd334db1a6450cca6739a0b23940397362134 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:32:59 -0500 Subject: [PATCH 55/80] Port vapes to Initialize() (#1224) --- code/game/objects/items/weapons/cigs_lighters.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 86bbb340b1..61ac601e71 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -634,8 +634,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM return (TOXLOSS|OXYLOSS) -/obj/item/clothing/mask/vape/New(loc, var/param_color = null) - ..() +/obj/item/clothing/mask/vape/Initialize(mapload, param_color) + . = ..() create_reagents(chem_volume) reagents.set_reacting(FALSE) // so it doesn't react until you light it reagents.add_reagent("nicotine", 50) From 4e381aaca40635717357f624257349431457d422 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:33:30 -0500 Subject: [PATCH 56/80] Fixes legion icon (#1222) --- code/modules/mob/living/simple_animal/hostile/mining_mobs.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 97fa07b5be..c2bd44d8ef 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -840,6 +840,9 @@ health = 120 brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced icon_state = "dwarf_legion" + icon_living = "dwarf_legion" + icon_aggro = "dwarf_legion" + icon_dead = "dwarf_legion" /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced stat_attack = 2 @@ -859,6 +862,7 @@ max_mobs = 3 spawn_time = 200 spawn_text = "peels itself off from" + mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion melee_damage_lower = 20 melee_damage_upper = 20 anchored = FALSE From 6c79b06e2ca3bb1f8d236468ec805066f1271fc7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:34:00 -0500 Subject: [PATCH 57/80] c4 now takes 3 seconds instead of 5 to plant (#1186) --- code/game/objects/items/weapons/grenades/plastic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm index 21a71f371d..a528a832c0 100644 --- a/code/game/objects/items/weapons/grenades/plastic.dm +++ b/code/game/objects/items/weapons/grenades/plastic.dm @@ -235,7 +235,7 @@ to_chat(user, "You start planting the bomb...") - if(do_after(user, 50, target = AM)) + if(do_after(user, 30, target = AM)) if(!user.temporarilyRemoveItemFromInventory(src)) return src.target = AM From f1239b1b9cc6f759a7e0bc7d5b3d43f265a71f7f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:34:01 -0500 Subject: [PATCH 58/80] Automatic changelog generation for PR #1186 [ci skip] --- html/changelogs/AutoChangeLog-pr-1186.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1186.yml diff --git a/html/changelogs/AutoChangeLog-pr-1186.yml b/html/changelogs/AutoChangeLog-pr-1186.yml new file mode 100644 index 0000000000..205bc61c7a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1186.yml @@ -0,0 +1,4 @@ +author: "4dplanner, robustin" +delete-after: True +changes: + - bugfix: "c4 has always taken 3 seconds to plant, and you are not allow to believe otherwise" From 833c0c549cf5482b70f304f2de84697596712d00 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:35:52 -0500 Subject: [PATCH 59/80] Make dance machine mob dancing asynchronous (#1221) --- code/game/machinery/dance_machine.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 8632243b67..214feeb63a 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -317,7 +317,7 @@ /obj/machinery/disco/proc/dance(var/mob/living/M) //Show your moves - + set waitfor = FALSE switch(rand(0,9)) if(0 to 1) dance2(M) From e9d00c2affc727d1e38472585c9d3275d318e85e Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:36:44 -0500 Subject: [PATCH 60/80] [READY] Adds ability to add bayonets to weapons - Only enabled on kinetic accelerators - refactors gunlight/bayonet sprites to ballistics too (#1191) --- code/game/objects/items/weapons/kitchen.dm | 4 +- code/modules/projectiles/gun.dm | 131 ++++++++++++------ code/modules/projectiles/guns/energy.dm | 13 +- .../guns/energy/kinetic_accelerator.dm | 15 +- icons/obj/guns/bayonets.dmi | Bin 0 -> 268 bytes icons/obj/guns/flashlights.dmi | Bin 0 -> 457 bytes 6 files changed, 98 insertions(+), 65 deletions(-) create mode 100644 icons/obj/guns/bayonets.dmi create mode 100644 icons/obj/guns/flashlights.dmi diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 54a41b2214..e11e36bbb6 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -65,6 +65,7 @@ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharpness = IS_SHARP_ACCURATE armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50) + var/bayonet = FALSE //Can this be attached to a gun? /obj/item/weapon/kitchen/knife/attack(mob/living/carbon/M, mob/living/carbon/user) if(user.zone_selected == "eyes") @@ -107,7 +108,7 @@ throwforce = 20 origin_tech = "materials=3;combat=4" attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut") - + bayonet = TRUE /obj/item/weapon/kitchen/knife/combat/survival name = "survival knife" @@ -115,6 +116,7 @@ desc = "A hunting grade survival knife." force = 15 throwforce = 15 + bayonet = TRUE /obj/item/weapon/kitchen/knife/combat/bone name = "bone dagger" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 6fb4e6276f..04761befdc 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -43,8 +43,11 @@ var/obj/item/device/firing_pin/pin = /obj/item/device/firing_pin //standard firing pin for most guns - var/obj/item/device/flashlight/gun_light = null + var/obj/item/device/flashlight/gun_light var/can_flashlight = 0 + var/obj/item/weapon/kitchen/knife/bayonet + var/can_bayonet = FALSE + var/datum/action/item_action/toggle_gunlight/alight var/list/upgrades = list() @@ -52,6 +55,8 @@ var/ammo_y_offset = 0 var/flight_x_offset = 0 var/flight_y_offset = 0 + var/knife_x_offset = 0 + var/knife_y_offset = 0 //Zooming var/zoomable = FALSE //whether the gun generates a Zoom action on creation @@ -65,8 +70,7 @@ if(pin) pin = new pin(src) if(gun_light) - verbs += /obj/item/weapon/gun/proc/toggle_gunlight - new /datum/action/item_action/toggle_gunlight(src) + alight = new /datum/action/item_action/toggle_gunlight(src) build_zooming() @@ -268,52 +272,88 @@ SSblackbox.add_details("gun_fired","[src.type]") return 1 +/obj/item/weapon/gun/update_icon() + ..() + cut_overlays() + if(gun_light && can_flashlight) + var/state = "flight[gun_light.on? "_on":""]" //Generic state. + if(gun_light.icon_state in icon_states('icons/obj/guns/flashlights.dmi')) //Snowflake state? + state = gun_light.icon_state + var/mutable_appearance/flashlight_overlay = mutable_appearance('icons/obj/guns/flashlights.dmi', state) + flashlight_overlay.pixel_x = flight_x_offset + flashlight_overlay.pixel_y = flight_y_offset + add_overlay(flashlight_overlay) + if(bayonet && can_bayonet) + var/state = "bayonet" //Generic state. + if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state? + state = bayonet.icon_state + var/mutable_appearance/knife_overlay = mutable_appearance('icons/obj/guns/bayonets.dmi', state) + knife_overlay.pixel_x = knife_x_offset + knife_overlay.pixel_y = knife_y_offset + add_overlay(knife_overlay) + /obj/item/weapon/gun/attack(mob/M as mob, mob/user) if(user.a_intent == INTENT_HARM) //Flogging - ..() - else - return + if(bayonet) + bayonet.attack(M, user) + return + return ..() + +/obj/item/weapon/gun/attack_obj(obj/O, mob/user) + if(user.a_intent == INTENT_HARM) + if(bayonet) + bayonet.attack_obj(O, user) + return + return ..() /obj/item/weapon/gun/attackby(obj/item/I, mob/user, params) - if(can_flashlight) - if(istype(I, /obj/item/device/flashlight/seclite)) - var/obj/item/device/flashlight/seclite/S = I - if(!gun_light) - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, "You click [S] into place on [src].") - if(S.on) - set_light(0) - gun_light = S - update_icon() - update_gunlight(user) - verbs += /obj/item/weapon/gun/proc/toggle_gunlight - var/datum/action/A = new /datum/action/item_action/toggle_gunlight(src) - if(loc == user) - A.Grant(user) - - if(istype(I, /obj/item/weapon/screwdriver)) - if(gun_light) - for(var/obj/item/device/flashlight/seclite/S in src) - to_chat(user, "You unscrew the seclite from [src].") - gun_light = null - S.forceMove(get_turf(user)) - update_gunlight(user) - S.update_brightness(user) - update_icon() - verbs -= /obj/item/weapon/gun/proc/toggle_gunlight - for(var/datum/action/item_action/toggle_gunlight/TGL in actions) - qdel(TGL) + if(user.a_intent == INTENT_HARM) + return ..() + else if(istype(I, /obj/item/device/flashlight/seclite)) + if(!can_flashlight) + return ..() + var/obj/item/device/flashlight/seclite/S = I + if(!gun_light) + if(!user.transferItemToLoc(I, src)) + return + to_chat(user, "You click \the [S] into place on \the [src].") + if(S.on) + set_light(0) + gun_light = S + update_icon() + update_gunlight(user) + alight = new /datum/action/item_action/toggle_gunlight(src) + if(loc == user) + alight.Grant(user) + else if(istype(I, /obj/item/weapon/kitchen/knife)) + if(!can_bayonet) + return ..() + var/obj/item/weapon/kitchen/knife/K = I + if(!bayonet) + if(!user.transferItemToLoc(I, src)) + return + to_chat(user, "You attach \the [K] to the front of ]the [src].") + bayonet = K + update_icon() + else if(istype(I, /obj/item/weapon/screwdriver)) + if(gun_light) + var/obj/item/device/flashlight/seclite/S = gun_light + to_chat(user, "You unscrew the seclite from \the [src].") + gun_light = null + S.forceMove(get_turf(user)) + update_gunlight(user) + S.update_brightness(user) + update_icon() + QDEL_NULL(alight) + if(bayonet) + var/obj/item/weapon/kitchen/knife/K = bayonet + K.forceMove(get_turf(user)) + bayonet = null + update_icon() else - ..() - - + return ..() /obj/item/weapon/gun/proc/toggle_gunlight() - set name = "Toggle Gunlight" - set category = "Object" - set desc = "Click to toggle your weapon's attached flashlight." - if(!gun_light) return @@ -343,12 +383,16 @@ ..() if(azoom) azoom.Grant(user) + if(alight) + alight.Grant(user) /obj/item/weapon/gun/dropped(mob/user) ..() zoom(user,FALSE) if(azoom) azoom.Remove(user) + if(alight) + alight.Remove(user) /obj/item/weapon/gun/AltClick(mob/user) @@ -370,9 +414,6 @@ to_chat(M, "Your gun is now skinned as [choice]. Say hello to your new friend.") update_icon() - - - /obj/item/weapon/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params) if(!ishuman(user) || !ishuman(target)) return diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index b022941f78..f8d0911011 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -10,6 +10,7 @@ var/list/ammo_type = list(/obj/item/ammo_casing/energy) var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next. var/can_charge = 1 //Can it be charged in a recharger? + var/automatic_charge_overlays = TRUE //Do we handle overlays with base update_icon()? var/charge_sections = 4 ammo_x_offset = 2 var/shaded_charge = 0 //if this gun uses a stateful charge bar for more detail @@ -116,7 +117,9 @@ return /obj/item/weapon/gun/energy/update_icon() - cut_overlays() + ..() + if(!automatic_charge_overlays) + return var/ratio = Ceiling((power_supply.charge / power_supply.maxcharge) * charge_sections) var/obj/item/ammo_casing/energy/shot = ammo_type[select] var/iconState = "[icon_state]_charge" @@ -138,14 +141,6 @@ add_overlay(charge_overlay) else add_overlay("[icon_state]_charge[ratio]") - if(gun_light && can_flashlight) - var/iconF = "flight" - if(gun_light.on) - iconF = "flight_on" - var/mutable_appearance/flashlight_overlay = mutable_appearance(icon, iconF) - flashlight_overlay.pixel_x = flight_x_offset - flashlight_overlay.pixel_y = flight_y_offset - add_overlay(flashlight_overlay) if(itemState) itemState += "[ratio]" item_state = itemState diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index e8d48373da..1799a33cbb 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -16,6 +16,9 @@ var/holds_charge = FALSE var/unique_frequency = FALSE // modified by KA modkits var/overheat = FALSE + can_bayonet = TRUE + knife_x_offset = 15 + knife_y_offset = 13 var/max_mod_capacity = 100 var/list/modkits = list() @@ -129,19 +132,11 @@ overheat = FALSE /obj/item/weapon/gun/energy/kinetic_accelerator/update_icon() - cut_overlays() + ..() + if(empty_state && !can_shoot()) add_overlay(empty_state) - if(gun_light && can_flashlight) - var/iconF = "flight" - if(gun_light.on) - iconF = "flight_on" - var/mutable_appearance/flashlight_overlay = mutable_appearance(icon, iconF) - flashlight_overlay.pixel_x = flight_x_offset - flashlight_overlay.pixel_y = flight_y_offset - add_overlay(flashlight_overlay) - //Casing /obj/item/ammo_casing/energy/kinetic projectile_type = /obj/item/projectile/kinetic diff --git a/icons/obj/guns/bayonets.dmi b/icons/obj/guns/bayonets.dmi new file mode 100644 index 0000000000000000000000000000000000000000..176005b7d7035e71552d4cd37702734f719e3045 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{*8>L*$jNBBxdct0ySA#K z&)CrZ#MN9|pe$oakY6x^!?PP{Ku&g5NJNQCYH@N=WKhlO#F@nvH#g*lHV9hnrO5Ui=W(a2tZ zt4n9MvFhd(5*kS-j?N65GGjJZqPF&qUppIk*%+!`Nd0B`pA!bO*3i?%F+^ixa)Jcw zVKEL)t(iM^>`-74X`Ry2+uJLsfvl_hC>f>Nw2Reg3>|2}-|^N-1zw+!ni}7#MjyT^vI)8sE-z^g9f+b-(txi;;&|WmfJz6~o}i!oFhqoCUMj zbhYR^+@4xJF)_78VCp5mRr*Kv_$qmStp9g%&7@<6N9xlKiX{lMZeYFP!kEKo7RV6Y z;45-~SfS6)xljDOXLH_P&mq(|G&WH#U@A97nuYVsmG(KeHlt1rm_U4}7y5@4R=Z9Qb7%oK3R(`H?ujV_) zl%Pxb`McT6Cq@_M{)ZT;u9l*F@@O1TaS?83{1OPJ)#rgmM literal 0 HcmV?d00001 From 8b0bc4ebcf57d44bd73b12f8f8ef1cadefb497bb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:36:45 -0500 Subject: [PATCH 61/80] Automatic changelog generation for PR #1191 [ci skip] --- html/changelogs/AutoChangeLog-pr-1191.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1191.yml diff --git a/html/changelogs/AutoChangeLog-pr-1191.yml b/html/changelogs/AutoChangeLog-pr-1191.yml new file mode 100644 index 0000000000..9e1d3c3eaa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1191.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "You can now add bayonets to kinetic accelerators. However, only combat knives and survival knives can be added. Harm intent attacking things will cause you to attack that thing with the bayonet instead!" From 0b44c77bfbfbe8bafb9f26e87c33f01231419808 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:37:45 -0500 Subject: [PATCH 62/80] UPDATE: Removes airlock charge from uplink (#1216) --- code/modules/uplink/uplink_item.dm | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 667742afc4..f603612bbf 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -725,16 +725,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. item = /obj/item/weapon/grenade/clusterbuster/soap cost = 6 -/datum/uplink_item/stealthy_weapons/door_charge - name = "Explosive Airlock Charge" - desc = "A small, easily concealable device. It can be applied to an open airlock panel, booby-trapping it. \ - The next person to use that airlock will trigger an explosion, knocking them down and destroying \ - the airlock maintenance panel." - item = /obj/item/device/doorCharge - cost = 2 - surplus = 10 - exclude_modes = list(/datum/game_mode/nuclear) - // Stealth Items /datum/uplink_item/stealthy_tools category = "Stealth and Camouflage Items" From 9006cfeb60043f100f67528d7c27cfc5fc414978 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:39:51 -0500 Subject: [PATCH 63/80] Map conversions will always write out LF (#1212) --- tools/mapmerge/map_helpers.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/mapmerge/map_helpers.py b/tools/mapmerge/map_helpers.py index 2e96e7e7e2..ea06641f50 100644 --- a/tools/mapmerge/map_helpers.py +++ b/tools/mapmerge/map_helpers.py @@ -125,7 +125,7 @@ def merge_map(newfile, backupfile, tgm): ####################### #write to file helpers# def write_dictionary_tgm(filename, dictionary, header = None): #write dictionary in tgm format - with open(filename, "w") as output: + with open(filename, "w", newline='\n') as output: output.write("{}\n".format(tgm_header)) if header: output.write("{}\n".format(header)) @@ -172,7 +172,7 @@ def write_dictionary_tgm(filename, dictionary, header = None): #write dictionary def write_grid_coord_small(filename, grid, maxx, maxy): #thanks to YotaXP for finding out about this one - with open(filename, "a") as output: + with open(filename, "a", newline='\n') as output: output.write("\n") for x in range(1, maxx+1): @@ -183,7 +183,7 @@ def write_grid_coord_small(filename, grid, maxx, maxy): #thanks to YotaXP for fi def write_dictionary(filename, dictionary, header = None): #writes a tile dictionary the same way Dreammaker does - with open(filename, "w") as output: + with open(filename, "w", newline='\n') as output: for key, value in dictionary.items(): if header: output.write("{}\n".format(header)) @@ -191,7 +191,7 @@ def write_dictionary(filename, dictionary, header = None): #writes a tile dictio def write_grid(filename, grid, maxx, maxy): #writes a map grid the same way Dreammaker does - with open(filename, "a") as output: + with open(filename, "a", newline='\n') as output: output.write("\n") output.write("(1,1,1) = {\"\n") From a1ebd8c7910f80c444ecd6bae8a7d467ef554af4 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:40:09 -0500 Subject: [PATCH 64/80] Refactors how diagonal smoothing underlays work (#1187) --- code/__HELPERS/icon_smoothing.dm | 21 +++----- code/game/turfs/closed.dm | 8 +++ code/game/turfs/open.dm | 3 ++ code/game/turfs/simulated/chasm.dm | 9 ++++ .../game/turfs/simulated/floor/fancy_floor.dm | 21 ++++++-- .../turfs/simulated/floor/plating/lava.dm | 5 ++ code/game/turfs/simulated/minerals.dm | 9 +++- code/game/turfs/space/space.dm | 6 +++ code/game/turfs/space/transit.dm | 54 +++++++++++-------- code/game/turfs/turf.dm | 6 +++ code/modules/mining/mine_items.dm | 5 +- 11 files changed, 105 insertions(+), 42 deletions(-) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index de46e18fde..a0de8d9840 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -167,23 +167,14 @@ underlay_appearance.icon = fixed_underlay["icon"] underlay_appearance.icon_state = fixed_underlay["icon_state"] else - var/turf/T = get_step(src, turn(adjacencies, 180)) - if(T && (T.density || T.smooth)) + var/turned_adjacency = turn(adjacencies, 180) + var/turf/T = get_step(src, turned_adjacency) + if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) T = get_step(src, turn(adjacencies, 135)) - if(T && (T.density || T.smooth)) + if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) T = get_step(src, turn(adjacencies, 225)) - - if(isspaceturf(T) && !istype(T, /turf/open/space/transit)) - underlay_appearance.icon = 'icons/turf/space.dmi' - underlay_appearance.icon_state = SPACE_ICON_STATE - underlay_appearance.plane = PLANE_SPACE - else if(T && !T.density && !T.smooth) - underlay_appearance.icon = T.icon - underlay_appearance.icon_state = T.icon_state - else if(baseturf && !initial(baseturf.density) && !initial(baseturf.smooth)) - underlay_appearance.icon = initial(baseturf.icon) - underlay_appearance.icon_state = initial(baseturf.icon_state) - else + //if all else fails, ask our own turf + if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency) && !get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) underlay_appearance.icon = DEFAULT_UNDERLAY_ICON underlay_appearance.icon_state = DEFAULT_UNDERLAY_ICON_STATE underlays = U diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 2c3e60694d..a459ac5903 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -5,6 +5,9 @@ density = 1 blocks_air = 1 +/turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + return FALSE + /turf/closed/indestructible name = "wall" icon = 'icons/turf/walls.dmi' @@ -108,6 +111,11 @@ explosion_block = 50 baseturf = /turf/closed/indestructible/necropolis +/turf/closed/indestructible/necropolis/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/floors.dmi' + underlay_appearance.icon_state = "necro1" + return TRUE + /turf/closed/indestructible/riveted/hierophant name = "wall" desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern." diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index ff278b415a..718451bcb0 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -45,6 +45,9 @@ /turf/open/indestructible/hierophant/two +/turf/open/indestructible/hierophant/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + return FALSE + /turf/open/indestructible/paper name = "notebook floor" desc = "A floor made of invulnerable notebook paper." diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 4f22487537..8f0de9675d 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -22,6 +22,10 @@ if(!drop_stuff()) STOP_PROCESSING(SSobj, src) +/turf/open/chasm/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/floors.dmi' + underlay_appearance.icon_state = "basalt" + return TRUE /turf/open/chasm/attackby(obj/item/C, mob/user, params, area/area_restriction) ..() @@ -171,6 +175,11 @@ planetary_atmos = TRUE initial_gas_mix = "o2=14;n2=23;TEMP=300" +/turf/open/chasm/jungle/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/floors.dmi' + underlay_appearance.icon_state = "dirt" + return TRUE + /turf/open/chasm/straight_down/jungle icon = 'icons/turf/floors/junglechasm.dmi' planetary_atmos = TRUE diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 4f6da47bde..91ed7a7cd6 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -140,7 +140,7 @@ floor_tile = /obj/item/stack/tile/carpet broken_states = list("damaged") smooth = SMOOTH_TRUE - canSmoothWith = list(/turf/open/floor/carpet, /turf/open/chasm) + canSmoothWith = list(/turf/open/floor/carpet) flags = NONE /turf/open/floor/carpet/Initialize() @@ -175,15 +175,22 @@ burnt = 1 update_icon() +/turf/open/floor/carpet/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + return FALSE -turf/open/floor/fakepit +/turf/open/floor/fakepit desc = "A clever illusion designed to look like a bottomless pit." smooth = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE - canSmoothWith = list(/turf/open/floor/fakepit, /turf/open/chasm) + canSmoothWith = list(/turf/open/floor/fakepit) icon = 'icons/turf/floors/Chasms.dmi' icon_state = "smooth" +/turf/open/floor/fakepit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/floors.dmi' + underlay_appearance.icon_state = "basalt" + return TRUE + /turf/open/floor/fakespace icon = 'icons/turf/space.dmi' icon_state = "0" @@ -193,4 +200,10 @@ turf/open/floor/fakepit /turf/open/floor/fakespace/Initialize() ..() - icon_state = "[rand(0,25)]" + icon_state = SPACE_ICON_STATE + +/turf/open/floor/fakespace/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/space.dmi' + underlay_appearance.icon_state = SPACE_ICON_STATE + underlay_appearance.plane = PLANE_SPACE + return TRUE diff --git a/code/game/turfs/simulated/floor/plating/lava.dm b/code/game/turfs/simulated/floor/plating/lava.dm index 9321b4f082..ead1e97d22 100644 --- a/code/game/turfs/simulated/floor/plating/lava.dm +++ b/code/game/turfs/simulated/floor/plating/lava.dm @@ -38,6 +38,11 @@ /turf/open/floor/plating/lava/make_plating() return +/turf/open/floor/plating/lava/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/floors.dmi' + underlay_appearance.icon_state = "basalt" + return TRUE + /turf/open/floor/plating/lava/GetHeatCapacity() . = 700000 diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 0a8230e186..9c3d8ed0c7 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -26,7 +26,7 @@ /turf/closed/mineral/Initialize() if (!canSmoothWith) - canSmoothWith = list(/turf/closed) + canSmoothWith = list(/turf/closed/mineral, /turf/closed/indestructible) pixel_y = -4 pixel_x = -4 icon = smooth_icon @@ -42,6 +42,13 @@ setDir(angle2dir(rotation+dir2angle(dir))) queue_smooth(src) +/turf/closed/mineral/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + if(turf_type) + underlay_appearance.icon = initial(turf_type.icon) + underlay_appearance.icon_state = initial(turf_type.icon_state) + return TRUE + return ..() + /turf/closed/mineral/attackby(obj/item/weapon/pickaxe/P, mob/user, params) if (!user.IsAdvancedToolUser()) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 1876d6f782..bac25e68c0 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -160,6 +160,12 @@ /turf/open/space/acid_act(acidpwr, acid_volume) return 0 +/turf/open/space/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = 'icons/turf/space.dmi' + underlay_appearance.icon_state = SPACE_ICON_STATE + underlay_appearance.plane = PLANE_SPACE + return TRUE + /turf/open/space/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd) if(!CanBuildHere()) diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index 68c00c54ec..c447b83a1f 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -4,6 +4,11 @@ baseturf = /turf/open/space/transit flags = NOJAUNT //This line goes out to every wizard that ever managed to escape the den. I'm sorry. +/turf/open/space/transit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + . = ..() + underlay_appearance.icon_state = "speedspace_ns_[get_transit_state(asking_turf)]" + underlay_appearance.transform = turn(matrix(), get_transit_angle(asking_turf)) + /turf/open/space/transit/south dir = SOUTH @@ -69,25 +74,32 @@ throw_atom(AM) /turf/open/space/transit/proc/update_icon() - var/p = 9 - var/angle = 0 - var/state = 1 - switch(dir) - if(NORTH) - angle = 180 - state = ((-p*x+y) % 15) + 1 - if(state < 1) - state += 15 - if(EAST) - angle = 90 - state = ((x+p*y) % 15) + 1 - if(WEST) - angle = -90 - state = ((x-p*y) % 15) + 1 - if(state < 1) - state += 15 - else - state = ((p*x+y) % 15) + 1 + icon_state = "speedspace_ns_[get_transit_state(src)]" + transform = turn(matrix(), get_transit_angle(src)) - icon_state = "speedspace_ns_[state]" - transform = turn(matrix(), angle) \ No newline at end of file +/proc/get_transit_state(turf/T) + var/p = 9 + . = 1 + switch(T.dir) + if(NORTH) + . = ((-p*T.x+T.y) % 15) + 1 + if(. < 1) + . += 15 + if(EAST) + . = ((T.x+p*T.y) % 15) + 1 + if(WEST) + . = ((T.x-p*T.y) % 15) + 1 + if(. < 1) + . += 15 + else + . = ((p*T.x+T.y) % 15) + 1 + +/proc/get_transit_angle(turf/T) + . = 0 + switch(T.dir) + if(NORTH) + . = 180 + if(EAST) + . = 90 + if(WEST) + . = -90 \ No newline at end of file diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index c4d35d7bd1..9d556e896f 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -394,6 +394,12 @@ if(ismob(A) || .) A.ratvar_act() +/turf/proc/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + underlay_appearance.icon = icon + underlay_appearance.icon_state = icon_state + underlay_appearance.dir = adjacency_dir + return TRUE + /turf/proc/add_blueprints(atom/movable/AM) var/image/I = new I.appearance = AM.appearance diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 3df4d521ff..10b7bc1eac 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -217,6 +217,7 @@ /area/survivalpod name = "\improper Emergency Shelter" icon_state = "away" + dynamic_lighting = DYNAMIC_LIGHTING_FORCED requires_power = 0 has_gravity = 1 @@ -394,7 +395,9 @@ icon = 'icons/obj/lavaland/donkvendor.dmi' icon_on = "donkvendor" icon_off = "donkvendor" - luminosity = 8 + light_range = 5 + light_power = 1.2 + light_color = "#DDFFD3" max_n_of_items = 10 pixel_y = -4 flags = NODECONSTRUCT From fd2c61f3d30b234a7fd6862a77b6b4b497852ab2 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:42:58 -0500 Subject: [PATCH 65/80] [MIRROR] Adds a minor documentation comment (#1097) * Adds a minor documentation comment * Update subsystems.dm * Delete subsystems.dm.rej --- code/__DEFINES/subsystems.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 8c8b360497..7303f0f33a 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -39,6 +39,7 @@ // Subsystem init_order, from highest priority to lowest priority +// Subsystems shutdown in the reverse of the order they initialize in // The numbers just define the ordering, they are meaningless otherwise. #define INIT_ORDER_SERVER_MAINT 16 @@ -71,4 +72,4 @@ #define RUNLEVEL_GAME 4 #define RUNLEVEL_POSTGAME 8 -#define RUNLEVELS_DEFAULT (RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME) \ No newline at end of file +#define RUNLEVELS_DEFAULT (RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME) From d1e38d9e1f8a82feefaccc1115bed2d82bfdbf73 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:43:20 -0500 Subject: [PATCH 66/80] Fixed very minor capitalization and punctuation inconsistencies. (#1104) --- code/game/objects/structures/artstuff.dm | 4 ++-- code/game/objects/structures/signs.dm | 20 +++++++++---------- .../living/simple_animal/bot/construction.dm | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index 23bbc40ed8..989bb6755b 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -5,7 +5,7 @@ /obj/structure/easel name = "easel" - desc = "only for the finest of art!" + desc = "Only for the finest of art!" icon = 'icons/obj/artstuff.dmi' icon_state = "easel" density = 1 @@ -49,7 +49,7 @@ GLOBAL_LIST_INIT(globalBlankCanvases, new(AMT_OF_CANVASES)) /obj/item/weapon/canvas name = "canvas" - desc = "draw out your soul on this canvas!" + desc = "Draw out your soul on this canvas!" icon = 'icons/obj/artstuff.dmi' icon_state = "11x11" resistance_flags = FLAMMABLE diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 445af97b4e..8ffebdc0ab 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -146,49 +146,49 @@ /obj/structure/sign/biohazard name = "\improper BIOHAZARD" - desc = "A warning sign which reads 'BIOHAZARD'" + desc = "A warning sign which reads 'BIOHAZARD'." icon_state = "bio" /obj/structure/sign/electricshock name = "\improper HIGH VOLTAGE" - desc = "A warning sign which reads 'HIGH VOLTAGE'" + desc = "A warning sign which reads 'HIGH VOLTAGE'." icon_state = "shock" /obj/structure/sign/examroom name = "\improper EXAM ROOM" - desc = "A guidance sign which reads 'EXAM ROOM'" + desc = "A guidance sign which reads 'EXAM ROOM'." icon_state = "examroom" /obj/structure/sign/vacuum name = "\improper HARD VACUUM AHEAD" - desc = "A warning sign which reads 'HARD VACUUM AHEAD'" + desc = "A warning sign which reads 'HARD VACUUM AHEAD'." icon_state = "space" /obj/structure/sign/deathsposal name = "\improper DISPOSAL: LEADS TO SPACE" - desc = "A warning sign which reads 'DISPOSAL: LEADS TO SPACE'" + desc = "A warning sign which reads 'DISPOSAL: LEADS TO SPACE'." icon_state = "deathsposal" /obj/structure/sign/pods name = "\improper ESCAPE PODS" - desc = "A warning sign which reads 'ESCAPE PODS'" + desc = "A warning sign which reads 'ESCAPE PODS'." icon_state = "pods" /obj/structure/sign/fire name = "\improper DANGER: FIRE" - desc = "A warning sign which reads 'DANGER: FIRE'" + desc = "A warning sign which reads 'DANGER: FIRE'." icon_state = "fire" /obj/structure/sign/nosmoking_1 name = "\improper NO SMOKING" - desc = "A warning sign which reads 'NO SMOKING'" + desc = "A warning sign which reads 'NO SMOKING'." icon_state = "nosmoking" /obj/structure/sign/nosmoking_2 name = "\improper NO SMOKING" - desc = "A warning sign which reads 'NO SMOKING'" + desc = "A warning sign which reads 'NO SMOKING'." icon_state = "nosmoking2" /obj/structure/sign/radiation @@ -223,7 +223,7 @@ /obj/structure/sign/nanotrasen name = "\improper NanoTrasen Logo " - desc = "A sign with the Nanotrasen Logo on it. Glory to Nanotrasen!" + desc = "A sign with the Nanotrasen Logo on it. Glory to Nanotrasen!" icon_state = "nanotrasen" /obj/structure/sign/science //These 3 have multiple types, just var-edit the icon_state to whatever one you want on the map diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 25be049546..b3b4725914 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -273,7 +273,7 @@ //Medbot Assembly /obj/item/weapon/firstaid_arm_assembly - name = "incomplete medibot assembly." + name = "incomplete medibot assembly" desc = "A first aid kit with a robot arm permanently grafted to it." icon = 'icons/mob/aibots.dmi' icon_state = "firstaid_arm" From 499ef04593c0786d1797b876ed53cdf18a8c366d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 15:43:21 -0500 Subject: [PATCH 67/80] Automatic changelog generation for PR #1104 [ci skip] --- html/changelogs/AutoChangeLog-pr-1104.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1104.yml diff --git a/html/changelogs/AutoChangeLog-pr-1104.yml b/html/changelogs/AutoChangeLog-pr-1104.yml new file mode 100644 index 0000000000..caffe5a257 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1104.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - spellcheck: "Fixed very minor inconsistencies on items & punctuation on items." From 2cc74f4a8fae1c8db4f48a8cd442f6556f58232c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 20:55:04 -0500 Subject: [PATCH 68/80] Changes incorporeal movement to use defines --- code/__DEFINES/mobs.dm | 5 +++++ code/game/gamemodes/miniantags/revenant/revenant.dm | 12 ++++++------ code/modules/clothing/suits/miscellaneous.dm | 2 +- code/modules/mob/living/living_defines.dm | 3 ++- .../living/simple_animal/guardian/types/ranged.dm | 4 ++-- code/modules/mob/living/simple_animal/parrot.dm | 2 +- code/modules/mob/mob_movement.dm | 6 +++--- 7 files changed, 20 insertions(+), 14 deletions(-) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 2d36d72ee3..e5d1f4c19e 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -124,3 +124,8 @@ #define MAX_CHICKENS 50 #define UNHEALING_EAR_DAMAGE 100 + + +#define INCORPOREAL_MOVE_BASIC 1 +#define INCORPOREAL_MOVE_SHADOW 2 // leaves a trail of shadows +#define INCORPOREAL_MOVE_JAUNT 3 // is blocked by holy water/salt \ No newline at end of file diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 293b114b36..da7cdee931 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -15,7 +15,7 @@ var/icon_stun = "revenant_stun" var/icon_drain = "revenant_draining" var/stasis = FALSE - incorporeal_move = 3 + incorporeal_move = INCORPOREAL_MOVE_JAUNT invisibility = INVISIBILITY_REVENANT health = INFINITY //Revenants don't use health, they use essence instead maxHealth = INFINITY @@ -102,7 +102,7 @@ if(unreveal_time && world.time >= unreveal_time) unreveal_time = 0 revealed = FALSE - incorporeal_move = 3 + incorporeal_move = INCORPOREAL_MOVE_JAUNT invisibility = INVISIBILITY_REVENANT to_chat(src, "You are once more concealed.") if(unstun_time && world.time >= unstun_time) @@ -222,7 +222,7 @@ R.essence = max(reforming_essence - 15 * perfectsouls, 75) //minus any perfect souls R.client_to_revive = client //If the essence reforms, the old revenant is put back in the body R.revenant = src - invisibility = INVISIBILITY_ABSTRACT + invisibility = INVISIBILITY_ABSTRACT revealed = FALSE ghostize(0)//Don't re-enter invisible corpse return @@ -236,7 +236,7 @@ return revealed = TRUE invisibility = 0 - incorporeal_move = 0 + incorporeal_move = FALSE if(!unreveal_time) to_chat(src, "You have been revealed!") unreveal_time = world.time + time @@ -309,12 +309,12 @@ /mob/living/simple_animal/revenant/proc/death_reset() revealed = FALSE - unreveal_time = 0 + unreveal_time = 0 notransform = 0 unstun_time = 0 inhibited = FALSE draining = FALSE - incorporeal_move = 3 + incorporeal_move = INCORPOREAL_MOVE_JAUNT invisibility = INVISIBILITY_REVENANT alpha=255 stasis = FALSE diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index bc1f25cfa7..02040b4469 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -541,5 +541,5 @@ name = "spooky ghost" desc = "this is obviously just a bedsheet, but maybe try it on?" icon_state = "bedsheet" - user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = 1, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150) + user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150) alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index fbf9c35303..83cc990a52 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -24,7 +24,8 @@ var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out. //Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects. - var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas. + var/incorporeal_move = FALSE //FALSE is off, INCORPOREAL_MOVE_BASIC is normal, INCORPOREAL_MOVE_SHADOW is for ninjas + //and INCORPOREAL_MOVE_JAUNT is blocked by holy water/salt var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them. diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm index 37777a5ead..e3792d40ba 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm @@ -37,7 +37,7 @@ environment_smash = initial(environment_smash) alpha = 255 range = initial(range) - incorporeal_move = 0 + incorporeal_move = FALSE to_chat(src, "You switch to combat mode.") toggle = FALSE else @@ -48,7 +48,7 @@ environment_smash = ENVIRONMENT_SMASH_NONE alpha = 45 range = 255 - incorporeal_move = 1 + incorporeal_move = INCORPOREAL_MOVE_BASIC to_chat(src, "You switch to scout mode.") toggle = TRUE else diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index e5dc99ea27..a0c1fe9fbe 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -948,7 +948,7 @@ color = "#FFFFFF77" speak_chance = 20 status_flags = GODMODE - incorporeal_move = 1 + incorporeal_move = INCORPOREAL_MOVE_BASIC butcher_results = list(/obj/item/weapon/ectoplasm = 1) /mob/living/simple_animal/parrot/Poly/ghost/Initialize() diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index e85dca9cad..43d8a924a1 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -209,10 +209,10 @@ return var/mob/living/L = mob switch(L.incorporeal_move) - if(1) + if(INCORPOREAL_MOVE_BASIC) L.loc = get_step(L, direct) L.setDir(direct) - if(2) + if(INCORPOREAL_MOVE_SHADOW) if(prob(50)) var/locx var/locy @@ -250,7 +250,7 @@ new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir) L.loc = get_step(L, direct) L.setDir(direct) - if(3) //Incorporeal move, but blocked by holy-watered tiles and salt piles. + if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles. var/turf/open/floor/stepTurf = get_step(L, direct) for(var/obj/effect/decal/cleanable/salt/S in stepTurf) to_chat(L, "[S] bars your passage!") From a4b0d04fe4b0562f6afe61c1810c09bbe559320b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 20:56:13 -0500 Subject: [PATCH 69/80] Fixes a runtime with contraband crates --- code/modules/cargo/packs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index b88cfc0315..421b8a057e 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1582,7 +1582,7 @@ name = "Contraband Crate" contraband = TRUE cost = 3000 - num_contained = 6 + num_contained = 5 contains = list(/obj/item/weapon/poster/random_contraband, /obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori, From de3d21902a07a7b9bd8d08acd753ea5880d0658f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 20:56:17 -0500 Subject: [PATCH 70/80] Fixes typo in garbage subsystem --- code/controllers/subsystem/garbage.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 2611bc53e6..234569bfdc 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -164,8 +164,8 @@ SUBSYSTEM_DEF(garbage) if (time > highest_del_time) highest_del_time = time if (time > 10) - log_game("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete)") - message_admins("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete).") + log_game("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete)") + message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete).") postpone(time/5) /datum/controller/subsystem/garbage/proc/HardQueue(datum/A) From fdb54c3ce3ead0b67282e724ad9140138727d8ff Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sat, 27 May 2017 22:49:20 -0500 Subject: [PATCH 71/80] hat --- code/modules/clothing/head/cit_hats.dm | 3 ++- icons/mob/head.dmi | Bin 174767 -> 174987 bytes 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/head/cit_hats.dm b/code/modules/clothing/head/cit_hats.dm index d562802db1..31b36b7723 100644 --- a/code/modules/clothing/head/cit_hats.dm +++ b/code/modules/clothing/head/cit_hats.dm @@ -1,5 +1,6 @@ /obj/item/clothing/head/hunter name = "hunter hat" desc = "It's a flimsy looking hat." - icon_state = "hunter" + item_state = "hunter" + icon_state = "hunter-worn" icon = 'icons/obj/clothing/cit_hats.dmi' \ No newline at end of file diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 9d63c276bc9ef32dd74be79e7ccea017ab24aa39..f98009ca3a5aaa6cab59b15bdcbede5583112ae2 100644 GIT binary patch delta 19809 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�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 V=n$6hm9zVp3zoJPRp#!|{{>ez#~T0u From fa42d8631a73f4dfc8b07e4a2484fab918b83a1d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 23:27:19 -0500 Subject: [PATCH 72/80] Comm Console Fix --- code/game/machinery/computer/communications.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index c9a448fc7b..605cd60ce6 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -54,7 +54,7 @@ /obj/machinery/computer/communications/Topic(href, href_list) if(..()) return - if (src.z > ZLEVEL_CENTCOM) //Can only use on centcom and SS13 + if (z != ZLEVEL_STATION && z != ZLEVEL_CENTCOM) //Can only use on centcom and SS13 to_chat(usr, "Unable to establish a connection: \black You're too far away from the station!") return usr.set_machine(src) From f64ba98e9092daa26870487b919532cdcde3e0be Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 28 May 2017 08:12:11 -0500 Subject: [PATCH 73/80] Ports modular computers to initialize --- .../computers/machinery/console_presets.dm | 2 +- .../computers/machinery/modular_computer.dm | 8 +++----- .../computers/machinery/modular_console.dm | 8 ++++---- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index b2f0c5fb07..18a43defb6 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -5,7 +5,7 @@ var/_has_battery = 0 var/_has_ai = 0 -/obj/machinery/modular_computer/console/preset/New() +/obj/machinery/modular_computer/console/preset/Initialize() . = ..() if(!cpu) return diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index b7b258d1ef..c8c303e453 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -27,15 +27,13 @@ var/obj/item/device/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things. -/obj/machinery/modular_computer/New() - ..() +/obj/machinery/modular_computer/Initialize() + . = ..() cpu = new(src) cpu.physical = src /obj/machinery/modular_computer/Destroy() - if(cpu) - qdel(cpu) - cpu = null + QDEL_NULL(cpu) return ..() /obj/machinery/modular_computer/attack_ghost(mob/dead/observer/user) diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm index 60315198ca..3f53ba715f 100644 --- a/code/modules/modular_computers/computers/machinery/modular_console.dm +++ b/code/modules/modular_computers/computers/machinery/modular_console.dm @@ -20,8 +20,8 @@ max_integrity = 300 integrity_failure = 150 -/obj/machinery/modular_computer/console/buildable/New() - ..() +/obj/machinery/modular_computer/console/buildable/Initialize() + . = ..() // User-built consoles start as empty frames. var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] var/obj/item/weapon/computer_hardware/hard_drive/network_card = cpu.all_components[MC_NET] @@ -30,8 +30,8 @@ qdel(network_card) qdel(hard_drive) -/obj/machinery/modular_computer/console/New() - ..() +/obj/machinery/modular_computer/console/Initialize() + . = ..() var/obj/item/weapon/computer_hardware/battery/battery_module = cpu.all_components[MC_CELL] if(battery_module) qdel(battery_module) From 9f665647c20c7cc5a62554311d584a6a4521077c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 28 May 2017 08:13:16 -0500 Subject: [PATCH 74/80] Ports cable structures to Initialize --- code/modules/power/cable.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 5bf4bab33e..c0ad4fd2b7 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -66,9 +66,8 @@ By design, d1 is the smallest direction and d2 is the highest icon = 'icons/obj/power_cond/power_cond_white.dmi' // the power cable object -/obj/structure/cable/New() - ..() - +/obj/structure/cable/Initialize() + . = ..() // ensure d1 & d2 reflect the icon_state for entering and exiting cable var/dash = findtext(icon_state, "-") @@ -529,7 +528,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai return(OXYLOSS) /obj/item/stack/cable_coil/New(loc, new_amount = null, var/param_color = null) - ..() + . = ..() if(new_amount) // MAXCOIL by default amount = new_amount if(param_color) From 4b9a7ce9cf092886698114f4f9bcc40b5c284a18 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 28 May 2017 08:14:21 -0500 Subject: [PATCH 75/80] Adds AI follow links to PDA messages and holopad speech --- code/game/objects/items/devices/PDA/PDA.dm | 9 ++++++++- code/modules/mob/living/silicon/ai/ai.dm | 16 ++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 4a64cf5c0d..f3c32d3d68 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -632,7 +632,14 @@ GLOBAL_LIST_EMPTY(PDAs) L = get(src, /mob/living/silicon) if(L && L.stat != UNCONSCIOUS) - to_chat(L, "\icon[src] Message from [source.owner] ([source.ownjob]), \"[msg.message]\"[msg.get_photo_ref()] (Reply)") + + var/hrefstart + var/hrefend + if (isAI(L)) + hrefstart = "" + hrefend = "" + + to_chat(L, "\icon[src.icon] Message from [hrefstart][source.owner] ([source.ownjob])[hrefend], \"[msg.message]\"[msg.get_photo_ref()] (Reply)") update_icon() add_overlay(icon_alert) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index d3fe5eb6d2..f4cfb363fd 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -833,8 +833,20 @@ /mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) raw_message = lang_treat(speaker, message_language, raw_message, spans, message_mode) - var/name_used = speaker.GetVoice() - var/rendered = "Relayed Speech: [name_used] [raw_message]" + var/start = "Relayed Speech: " + var/namepart = "[speaker.GetVoice()][speaker.get_alt_name()]" + var/hrefpart = "" + var/jobpart + + if (iscarbon(speaker)) + var/mob/living/carbon/S = speaker + if(S.job) + jobpart = "[S.job]" + else + jobpart = "Unknown" + + var/rendered = "[start][hrefpart][namepart] ([jobpart]) [raw_message]" + show_message(rendered, 2) /mob/living/silicon/ai/fully_replace_character_name(oldname,newname) From f89d732d0ae80f87bf450b5d5f7f38ebf4ad0cde Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 28 May 2017 08:16:35 -0500 Subject: [PATCH 76/80] Removes duplicate sharpener from gang uplink --- code/game/gamemodes/gang/gang_datum.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm index 0ff9ef4f2d..f5db21f0ab 100644 --- a/code/game/gamemodes/gang/gang_datum.dm +++ b/code/game/gamemodes/gang/gang_datum.dm @@ -53,7 +53,6 @@ /datum/gang_item/weapon/ammo/uzi_ammo, /datum/gang_item/equipment/sharpener, /datum/gang_item/equipment/spraycan, - /datum/gang_item/equipment/sharpener, /datum/gang_item/equipment/emp, /datum/gang_item/equipment/c4, /datum/gang_item/equipment/frag, @@ -91,7 +90,6 @@ /datum/gang_item/weapon/ammo/uzi_ammo, /datum/gang_item/equipment/sharpener, /datum/gang_item/equipment/spraycan, - /datum/gang_item/equipment/sharpener, /datum/gang_item/equipment/emp, /datum/gang_item/equipment/c4, /datum/gang_item/equipment/frag, From 64562ba0c478623465f365cbd69d27fdd27059a7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 28 May 2017 08:17:44 -0500 Subject: [PATCH 77/80] Fixes clown creampie cannon not recharging properly --- code/game/objects/items/weapons/pneumaticCannon.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index 64fb4c7ecc..91b605543b 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -270,4 +270,4 @@ /obj/item/weapon/pneumatic_cannon/pie/selfcharge/process() if(++charge_tick >= charge_ticks) - fill_with_type(/obj/item/weapon/reagent_containers/food/snacks/pie, charge_amount) + fill_with_type(/obj/item/weapon/reagent_containers/food/snacks/pie/cream, charge_amount) From cd554d253795ac758b9cd52f9ba6733c41adfb94 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 28 May 2017 11:09:34 -0500 Subject: [PATCH 78/80] Fixes crew monitoring console minimaps --- .../{Box Station_1.png => Box Station_2.png} | Bin .../{CereStation_1.png => CereStation_2.png} | Bin .../{Delta Station_1.png => Delta Station_2.png} | Bin .../{MetaStation_1.png => MetaStation_2.png} | Bin .../{OmegaStation_1.png => OmegaStation_2.png} | Bin 5 files changed, 0 insertions(+), 0 deletions(-) rename icons/minimaps/{Box Station_1.png => Box Station_2.png} (100%) rename icons/minimaps/{CereStation_1.png => CereStation_2.png} (100%) rename icons/minimaps/{Delta Station_1.png => Delta Station_2.png} (100%) rename icons/minimaps/{MetaStation_1.png => MetaStation_2.png} (100%) rename icons/minimaps/{OmegaStation_1.png => OmegaStation_2.png} (100%) diff --git a/icons/minimaps/Box Station_1.png b/icons/minimaps/Box Station_2.png similarity index 100% rename from icons/minimaps/Box Station_1.png rename to icons/minimaps/Box Station_2.png diff --git a/icons/minimaps/CereStation_1.png b/icons/minimaps/CereStation_2.png similarity index 100% rename from icons/minimaps/CereStation_1.png rename to icons/minimaps/CereStation_2.png diff --git a/icons/minimaps/Delta Station_1.png b/icons/minimaps/Delta Station_2.png similarity index 100% rename from icons/minimaps/Delta Station_1.png rename to icons/minimaps/Delta Station_2.png diff --git a/icons/minimaps/MetaStation_1.png b/icons/minimaps/MetaStation_2.png similarity index 100% rename from icons/minimaps/MetaStation_1.png rename to icons/minimaps/MetaStation_2.png diff --git a/icons/minimaps/OmegaStation_1.png b/icons/minimaps/OmegaStation_2.png similarity index 100% rename from icons/minimaps/OmegaStation_1.png rename to icons/minimaps/OmegaStation_2.png From 13b6a18f428c6163afeea0a8518ae7ea4f4f96ae Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 28 May 2017 14:16:07 -0500 Subject: [PATCH 79/80] Automatic changelog generation for PR #1268 [ci skip] --- html/changelogs/AutoChangeLog-pr-1268.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1268.yml diff --git a/html/changelogs/AutoChangeLog-pr-1268.yml b/html/changelogs/AutoChangeLog-pr-1268.yml new file mode 100644 index 0000000000..1ed2a4fcb7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1268.yml @@ -0,0 +1,4 @@ +author: "QualityVan" +delete-after: True +changes: + - bugfix: "Crew monitoring consoles once again have minimaps while you're on the station level" From 7e88443115a94e41a61cddc6751e1252abc1dc9d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 28 May 2017 14:32:19 -0500 Subject: [PATCH 80/80] Automatic changelog generation for PR #1255 [ci skip] --- html/changelogs/AutoChangeLog-pr-1255.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1255.yml diff --git a/html/changelogs/AutoChangeLog-pr-1255.yml b/html/changelogs/AutoChangeLog-pr-1255.yml new file mode 100644 index 0000000000..fdd7e8ac0f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1255.yml @@ -0,0 +1,5 @@ +author: "cacogen" +delete-after: True +changes: + - rscadd: "Adds AI follow links to holopad speech and PDA messages. Note that PDA messages point to the owner of the PDA and not the PDA's actual location." + - bugfix: "Fixes PDA icon not showing up beside received messages for AIs"