From d59ff1e1f9e34a2af0b4d61ef1652b201d777179 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Mon, 27 Apr 2015 08:21:55 +0200 Subject: [PATCH 01/40] Begins work to remove the need for spawn() in New() procs. --- code/game/atoms_movable.dm | 5 +++++ code/game/gamemodes/gameticker.dm | 6 ------ code/setup.dm | 5 +++++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index aabcb3653a0..adbd5cc3ce6 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -14,6 +14,11 @@ var/moved_recently = 0 var/mob/pulledby = null +/atom/movable/New() + ..() + if(ticker && ticker.current_state == GAME_STATE_PLAYING) + initialize() + /atom/movable/Del() if(isnull(gcDestroyed) && loc) testing("GC: -- [type] was deleted via del() rather than qdel() --") diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index f67bd7f1d09..68641616d8e 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -1,11 +1,5 @@ var/global/datum/controller/gameticker/ticker -#define GAME_STATE_PREGAME 1 -#define GAME_STATE_SETTING_UP 2 -#define GAME_STATE_PLAYING 3 -#define GAME_STATE_FINISHED 4 - - /datum/controller/gameticker var/const/restart_timeout = 600 var/current_state = GAME_STATE_PREGAME diff --git a/code/setup.dm b/code/setup.dm index 0359233d35e..1d4d5b5eb83 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -1,5 +1,10 @@ #define DEBUG +#define GAME_STATE_PREGAME 1 +#define GAME_STATE_SETTING_UP 2 +#define GAME_STATE_PLAYING 3 +#define GAME_STATE_FINISHED 4 + // Math constants. #define M_E 2.71828183 #define M_PI 3.14159265 From 6c8bc809c6a80e3af8a5a8fb8915e4d055f53996 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Tue, 28 Apr 2015 20:37:57 +0100 Subject: [PATCH 02/40] Adds more items to custom loadout --- code/modules/client/preferences_gear.dm | 310 +++++++++++++++++++++-- html/changelogs/Yoshax-Alloftheitems.YML | 4 + 2 files changed, 297 insertions(+), 17 deletions(-) create mode 100644 html/changelogs/Yoshax-Alloftheitems.YML diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 1f51b6f050b..413e8082a86 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -163,6 +163,12 @@ var/global/list/gear_datums = list() cost = 1 slot = slot_head +/datum/gear/wcap + display_name = "cap, white" + path = /obj/item/clothing/head/soft/mime + cost = 1 + slot = slot_head + /datum/gear/hairflower display_name = "hair flower pin" path = /obj/item/clothing/head/hairflower @@ -181,12 +187,24 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_head +/datum/gear/rhardhat + display_name = "hardhat, red" + path = /obj/item/clothing/head/hardhat/red + cost = 2 + slot = slot_head + /datum/gear/yhardhat display_name = "hardhat, yellow" path = /obj/item/clothing/head/hardhat cost = 2 slot = slot_head +/datum/gear/whardhat + display_name = "hardhat, white" + path = /obj/item/clothing/head/hardhat/white + cost = 2 + slot = slot_head + /datum/gear/boater display_name = "hat, boatsman" path = /obj/item/clothing/head/boaterhat @@ -205,6 +223,12 @@ var/global/list/gear_datums = list() cost = 1 slot = slot_head +/datum/gear/tophat + display_name = "hat, tophat" + path = /obj/item/clothing/head/that + cost = 1 + slot = slot_head + // Wig by Earthcrusher, blame him. /datum/gear/philosopher_wig display_name = "natural philosopher's wig" @@ -239,12 +263,37 @@ var/global/list/gear_datums = list() display_name = "Glasses, green" path = /obj/item/clothing/glasses/gglasses cost = 1 + slot = slot_glasses + +/datum/gear/prescriptionhipster + display_name = "Glasses, hipster" + path = /obj/item/clothing/glasses/regular/hipster + cost = 1 + slot = slot_glasses + +/datum/gear/prescription + display_name = "Glasses, prescription" + path = /obj/item/clothing/glasses/regular + cost = 1 + slot = slot_glasses + +/datum/gear/monocle + display_name = "Monocle" + path = /obj/item/clothing/glasses/monocle + cost = 1 + slot = slot_glasses /datum/gear/scanning_goggles display_name = "scanning goggles" path = /obj/item/clothing/glasses/fluff/uzenwa_sissra_1 cost = 1 -// allowed_roles = list("Roboticist", "Scientist", "Research Director") + slot = slot_glasses + +/datum/gear/sciencegoggles + display_name = "Science Goggles" + path = /obj/item/clothing/glasses/science + cost = 1 + slot = slot_glasses /datum/gear/security display_name = "Security HUD" @@ -260,7 +309,7 @@ var/global/list/gear_datums = list() slot = slot_glasses allowed_roles = list("Security Officer","Head of Security","Warden") -/datum/gear/prescription +/datum/gear/prescriptionsun display_name = "sunglasses, presciption" path = /obj/item/clothing/glasses/sunglasses/prescription cost = 2 @@ -276,18 +325,18 @@ var/global/list/gear_datums = list() // Uniform slot -/datum/gear/exec_suit - display_name = "executive suit" - path = /obj/item/clothing/under/suit_jacket/really_black - slot = slot_w_uniform - cost = 1 - /datum/gear/blazer_blue display_name = "blazer, blue" path = /obj/item/clothing/under/blazer slot = slot_w_uniform cost = 1 +/datum/gear/cheongsam + display_name = "cheongsam, white" + path = /obj/item/clothing/under/cheongsam + slot = slot_w_uniform + cost = 1 + /datum/gear/kilt display_name = "kilt" path = /obj/item/clothing/under/kilt @@ -300,6 +349,17 @@ var/global/list/gear_datums = list() slot = slot_w_uniform cost = 1 +/datum/gear/blackfjumpsuit + display_name = "jumpsuit, female-black" + path = /obj/item/clothing/under/color/blackf + slot = slot_w_uniform + cost = 1 +/datum/gear/blackfjumpsuit + display_name = "jumpsuit, rainbow" + path = /obj/item/clothing/under/rainbow + slot = slot_w_uniform + cost = 1 + /datum/gear/skirt_blue display_name = "plaid skirt, blue" path = /obj/item/clothing/under/dress/plaid_blue @@ -324,6 +384,114 @@ var/global/list/gear_datums = list() slot = slot_w_uniform cost = 1 +/datum/gear/amishsuit + display_name = "suit, amish" + path = /obj/item/clothing/under/sl_suit + slot = slot_w_uniform + cost = 1 + +/datum/gear/blacksuit + display_name = "suit, black" + path = /obj/item/clothing/under/suit_jacket + slot = slot_w_uniform + cost = 1 + +/datum/gear/shinyblacksuit + display_name = "suit, shiny-black" + path = /obj/item/clothing/under/lawyer/black + slot = slot_w_uniform + cost = 1 + +/datum/gear/bluesuit + display_name = "suit, blue" + path = /obj/item/clothing/under/lawyer/blue + slot = slot_w_uniform + cost = 1 + +/datum/gear/burgundysuit + display_name = "suit, burgundy" + path = /obj/item/clothing/under/suit_jacket/burgundy + slot = slot_w_uniform + cost = 1 + +/datum/gear/checkeredsuit + display_name = "suit, checkered" + path = /obj/item/clothing/under/suit_jacket/checkered + slot = slot_w_uniform + cost = 1 + +/datum/gear/charcoalsuit + display_name = "suit, charcoal" + path = /obj/item/clothing/under/suit_jacket/charcoal + slot = slot_w_uniform + cost = 1 + +/datum/gear/execsuit + display_name = "suit, executive" + path = /obj/item/clothing/under/suit_jacket/really_black + slot = slot_w_uniform + cost = 1 + +/datum/gear/femaleexecsuit + display_name = "suit, female-executive" + path = /obj/item/clothing/under/suit_jacket/female + slot = slot_w_uniform + cost = 1 + +/datum/gear/gentlesuit + display_name = "suit, gentlemen" + path = /obj/item/clothing/under/gentlesuit + slot = slot_w_uniform + cost = 1 + +/datum/gear/navysuit + display_name = "suit, navy" + path = /obj/item/clothing/under/suit_jacket/navy + slot = slot_w_uniform + cost = 1 + +/datum/gear/redsuit + display_name = "suit, red" + path = /obj/item/clothing/under/suit_jacket/red + slot = slot_w_uniform + cost = 1 + +/datum/gear/redlawyer + display_name = "suit, lawyer-red" + path = /obj/item/clothing/under/lawyer/red + slot = slot_w_uniform + cost = 1 + +/datum/gear/oldmansuit + display_name = "suit, old-man" + path = /obj/item/clothing/under/lawyer/oldman + slot = slot_w_uniform + cost = 1 + +/datum/gear/purplesuit + display_name = "suit, purple" + path = /obj/item/clothing/under/lawyer/purpsuit + slot = slot_w_uniform + cost = 1 + +/datum/gear/tansuit + display_name = "suit, tan" + path = /obj/item/clothing/under/suit_jacket/tan + slot = slot_w_uniform + cost = 1 + +/datum/gear/whitesuit + display_name = "suit, white" + path = /obj/item/clothing/under/scratch + slot = slot_w_uniform + cost = 1 + +/datum/gear/whitebluesuit + display_name = "suit, white-blue" + path = /obj/item/clothing/under/lawyer/bluesuit + slot = slot_w_uniform + cost = 1 + /datum/gear/sundress display_name = "sundress" path = /obj/item/clothing/under/sundress @@ -336,12 +504,6 @@ var/global/list/gear_datums = list() slot = slot_w_uniform cost = 1 -/datum/gear/cheongsam - display_name = "cheongsam, white" - path = /obj/item/clothing/under/cheongsam - slot = slot_w_uniform - cost = 1 - /datum/gear/uniform_captain display_name = "uniform, captain's dress" path = /obj/item/clothing/under/dress/dress_cap @@ -518,9 +680,9 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_wear_suit -/datum/gear/blue_lawyer_jacket - display_name = "suit jacket, blue" - path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket +/datum/gear/hazard_vest + display_name = "hazard vest" + path = /obj/item/clothing/suit/storage/hazardvest cost = 2 slot = slot_wear_suit @@ -548,6 +710,36 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_wear_suit +/datum/gear/bluelabcoat + display_name = "labcoat, blue" + path = /obj/item/clothing/suit/storage/toggle/labcoat/blue + cost = 2 + slot = slot_wear_suit + +/datum/gear/greenlabcoat + display_name = "labcoat, green" + path = /obj/item/clothing/suit/storage/toggle/labcoat/green + cost = 2 + slot = slot_wear_suit + +/datum/gear/orangelabcoat + display_name = "labcoat, orange" + path = /obj/item/clothing/suit/storage/toggle/labcoat/orange + cost = 2 + slot = slot_wear_suit + +/datum/gear/purplelabcoat + display_name = "labcoat, purple" + path = /obj/item/clothing/suit/storage/toggle/labcoat/purple + cost = 2 + slot = slot_wear_suit + +/datum/gear/redlabcoat + display_name = "labcoat, red" + path = /obj/item/clothing/suit/storage/toggle/labcoat/red + cost = 2 + slot = slot_wear_suit + /datum/gear/overalls display_name = "overalls" path = /obj/item/clothing/suit/apron/overalls @@ -591,6 +783,18 @@ var/global/list/gear_datums = list() slot = slot_wear_suit // whitelisted = "Unathi" // You don't have a monopoly on a robe! +/datum/gear/blue_lawyer_jacket + display_name = "suit jacket, blue" + path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket + cost = 2 + slot = slot_wear_suit + +/datum/gear/purple_lawyer_jacket + display_name = "suit jacket, purple" + path = /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket + cost = 2 + slot = slot_wear_suit + /datum/gear/suspenders display_name = "suspenders" path = /obj/item/clothing/suit/suspenders @@ -630,18 +834,49 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_gloves +/datum/gear/light_brown_gloves + display_name = "gloves, light-brown" + path = /obj/item/clothing/gloves/light_brown + cost = 2 + slot = slot_gloves + /datum/gear/green_gloves display_name = "gloves, green" path = /obj/item/clothing/gloves/green cost = 2 slot = slot_gloves +/datum/gear/grey_gloves + display_name = "gloves, grey" + path = /obj/item/clothing/gloves/grey + cost = 2 + slot = slot_gloves + +/datum/gear/latex_gloves + display_name = "gloves, latex" + path = /obj/item/clothing/gloves/latex + cost = 2 + slot = slot_gloves + + /datum/gear/orange_gloves display_name = "gloves, orange" path = /obj/item/clothing/gloves/orange cost = 2 slot = slot_gloves +/datum/gear/purple_gloves + display_name = "gloves, purple" + path = /obj/item/clothing/gloves/purple + cost = 2 + slot = slot_gloves + +/datum/gear/rainbow_gloves + display_name = "gloves, rainbow" + path = /obj/item/clothing/gloves/rainbow + cost = 2 + slot = slot_gloves + /datum/gear/red_gloves display_name = "gloves, red" path = /obj/item/clothing/gloves/red @@ -728,6 +963,12 @@ var/global/list/gear_datums = list() cost = 1 slot = slot_shoes +/datum/gear/rainbow_shoes + display_name = "shoes, rainbow" + path = /obj/item/clothing/shoes/rainbow + cost = 1 + slot = slot_shoes + /datum/gear/red_shoes display_name = "shoes, red" path = /obj/item/clothing/shoes/red @@ -822,6 +1063,17 @@ var/global/list/gear_datums = list() sort_category = "misc" cost = 1 +/datum/gear/flask + display_name = "flask" + path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask + sort_category = "misc" + cost = 1 + +/datum/gear/vacflask + display_name = "vacuum-flask" + path = /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask + sort_category = "misc" + cost = 1 /datum/gear/blipstick display_name = "lipstick, black" path = /obj/item/weapon/lipstick/black @@ -846,6 +1098,18 @@ var/global/list/gear_datums = list() sort_category = "misc" cost = 1 +/datum/gear/smokingpipe + display_name = "pipe, smoking" + path = /obj/item/clothing/mask/smokable/pipe + sort_category = "misc" + cost = 1 + +/datum/gear/cornpipe + display_name = "pipe, corn" + path = /obj/item/clothing/mask/smokable/pipe/cobpipe + sort_category = "misc" + cost = 1 + /datum/gear/matchbook display_name = "matchbook" path = /obj/item/weapon/storage/box/matches @@ -858,6 +1122,12 @@ var/global/list/gear_datums = list() sort_category = "misc" cost = 1 +/datum/gear/zippo + display_name = "zippo" + path = /obj/item/weapon/flame/lighter/zippo + sort_category = "misc" + cost = 1 + /*/datum/gear/combitool display_name = "combi-tool" path = /obj/item/weapon/combitool @@ -865,6 +1135,12 @@ var/global/list/gear_datums = list() // Stuff worn on the ears. Items here go in the "ears" sort_category but they must not use // the slot_r_ear or slot_l_ear as the slot, or else players will spawn with no headset. +/datum/gear/earmuffs + display_name = "earmuffs" + path = /obj/item/clothing/ears/earmuffs + cost = 1 + sort_category = "ears" + /datum/gear/skrell_chain display_name = "skrell headtail-wear, female, chain" path = /obj/item/clothing/ears/skrell/chain diff --git a/html/changelogs/Yoshax-Alloftheitems.YML b/html/changelogs/Yoshax-Alloftheitems.YML new file mode 100644 index 00000000000..57d50b195b7 --- /dev/null +++ b/html/changelogs/Yoshax-Alloftheitems.YML @@ -0,0 +1,4 @@ +author: Yoshax +delete-after: True +changes: + - rscadd: "Adds more items to custom loadout, including a number of dressy suits and some other things." From e5cd8c7adb5a8790820369f46099af5c655409a9 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Tue, 28 Apr 2015 20:40:16 +0100 Subject: [PATCH 03/40] Fixes jacket --- code/modules/client/preferences_gear.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 413e8082a86..2431d481093 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -791,7 +791,7 @@ var/global/list/gear_datums = list() /datum/gear/purple_lawyer_jacket display_name = "suit jacket, purple" - path = /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket + path = /obj/item/clothing/suit/storage/lawyer/purpjacket cost = 2 slot = slot_wear_suit From fbede7a1931df4d093f048c5e73a89145ac2b2f2 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 28 Apr 2015 23:00:56 -0400 Subject: [PATCH 04/40] Minor ZAS-related cleanup --- code/ZAS/Atom.dm | 2 +- code/ZAS/Turf.dm | 7 +++++-- code/__HELPERS/unsorted.dm | 24 ------------------------ code/game/turfs/turf.dm | 12 +----------- 4 files changed, 7 insertions(+), 38 deletions(-) diff --git a/code/ZAS/Atom.dm b/code/ZAS/Atom.dm index 6f75f4ea295..e655295f783 100644 --- a/code/ZAS/Atom.dm +++ b/code/ZAS/Atom.dm @@ -50,7 +50,7 @@ atom/proc/c_airblock(turf/other) #ifdef ZASDBG ASSERT(isturf(other)) #endif - return !CanPass(null, other, 0, 0) + 2*!CanPass(null, other, 1.5, 1) + return (AIR_BLOCKED*!CanPass(null, other, 0, 0))|(ZONE_BLOCKED*!CanPass(null, other, 1.5, 1)) turf/c_airblock(turf/other) diff --git a/code/ZAS/Turf.dm b/code/ZAS/Turf.dm index 9d031ce3d39..1b770590e10 100644 --- a/code/ZAS/Turf.dm +++ b/code/ZAS/Turf.dm @@ -46,6 +46,7 @@ air_master.connect(sim, src) /turf/simulated/update_air_properties() + if(zone && zone.invalid) c_copy_air() zone = null //Easier than iterating through the list at the zone. @@ -120,8 +121,10 @@ //Might have assigned a zone, since this happens for each direction. if(!zone) - //if((block & ZONE_BLOCKED) || (r_block & ZONE_BLOCKED && !(s_block & ZONE_BLOCKED))) - if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || (r_block & ZONE_BLOCKED && !(s_block & ZONE_BLOCKED))) + //We do not merge if + // they are blocking us and we are not blocking them, or if + // we are blocking them and not blocking ourselves - this prevents tiny zones from forming on doorways. + if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || ((r_block & ZONE_BLOCKED) && !(s_block & ZONE_BLOCKED))) #ifdef ZASDBG if(verbose) world << "[d] is zone blocked." //dbg(zone_blocked, d) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index c65698933c0..564910d3df2 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -922,30 +922,6 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl refined_trg -= B continue moving - var/list/doors = new/list() - - if(toupdate.len) - for(var/turf/simulated/T1 in toupdate) - for(var/obj/machinery/door/D2 in T1) - doors += D2 - /*if(T1.parent) - air_master.groups_to_rebuild += T1.parent - else - air_master.tiles_to_update += T1*/ - - if(fromupdate.len) - for(var/turf/simulated/T2 in fromupdate) - for(var/obj/machinery/door/D2 in T2) - doors += D2 - /*if(T2.parent) - air_master.groups_to_rebuild += T2.parent - else - air_master.tiles_to_update += T2*/ - - for(var/obj/O in doors) - O:update_nearby_tiles(1) - - proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) if(!original) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 29f425d4a3a..5e8e5747c0a 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -227,12 +227,6 @@ if(S.zone) S.zone.rebuild() if(ispath(N, /turf/simulated/floor)) - //if the old turf had a zone, connect the new turf to it as well - Cael - //Adjusted by SkyMarshal 5/10/13 - The air master will handle the addition of the new turf. - //if(zone) - // zone.RemoveTurf(src) - // if(!zone.CheckStatus()) - // zone.SetStatus(ZONE_ACTIVE) var/turf/simulated/W = new N( locate(src.x, src.y, src.z) ) //W.Assimilate_Air() @@ -249,7 +243,7 @@ W.RemoveLattice() if(air_master) - air_master.mark_for_update(src) + air_master.mark_for_update(src) //handle the addition of the new turf. for(var/turf/space/S in range(W,1)) S.update_starlight() @@ -258,10 +252,6 @@ return W else - //if(zone) - // zone.RemoveTurf(src) - // if(!zone.CheckStatus()) - // zone.SetStatus(ZONE_ACTIVE) var/turf/W = new N( locate(src.x, src.y, src.z) ) W.lighting_lumcount += old_lumcount From 493552d68e128370654420425a7c13ca84cb51c7 Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Wed, 29 Apr 2015 14:36:24 +0200 Subject: [PATCH 05/40] Updating the changelog. --- html/changelog.html | 15 +++++++++++++++ html/changelogs/.all_changelog.yml | 12 ++++++++++++ html/changelogs/Daranz-paper_functionality.yml | 5 ----- html/changelogs/HarpyEagle-PR-8971.yml | 13 ------------- html/changelogs/PsiOmegaDelta-PR-9008.yml | 4 ---- html/changelogs/PsiOmegaDelta-PortableNanoUI.yml | 4 ---- 6 files changed, 27 insertions(+), 26 deletions(-) delete mode 100644 html/changelogs/Daranz-paper_functionality.yml delete mode 100644 html/changelogs/HarpyEagle-PR-8971.yml delete mode 100644 html/changelogs/PsiOmegaDelta-PR-9008.yml delete mode 100644 html/changelogs/PsiOmegaDelta-PortableNanoUI.yml diff --git a/html/changelog.html b/html/changelog.html index d83bfdb3d17..51e5d94b73b 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,21 @@ -->
+

29 April 2015

+

Daranz updated:

+
    +
  • Paper bundles can now have papers inserted at arbitrary points. This can be done by clicking the previous/next page links with a sheet of paper in hand.
  • +
+

HarpyEagle updated:

+
    +
  • Added new fire modes to various guns: c20r, STS-35, WT-550, Z8, L6 SAW, and double barreled shotgun. The firing modes work the same way as the egun; click on the weapon with it in your active hand to cycle between modes. Unloading these weapons now requires that you click on them with an empty hand.
  • +
+

PsiOmegaDelta updated:

+
    +
  • Portable atmospheric pumps and scrubbers now use NanoUI.
  • +
  • Two new events which will cause damage to APCs or cameras when triggered.
  • +
+

28 April 2015

Jarcolr updated: