Nuke ops updates

This commit is contained in:
Mark van Alphen
2019-04-07 21:57:22 +02:00
parent f45174ff7c
commit f63b587f54
12 changed files with 392 additions and 224 deletions
+2 -2
View File
@@ -1299,7 +1299,7 @@
/turf/simulated/shuttle/plating/vox,
/area/shuttle/vox)
"ade" = (
/obj/structure/closet/syndicate/suits,
/obj/machinery/suit_storage_unit/syndicate/secure,
/turf/simulated/shuttle/floor{
icon_state = "floor4"
},
@@ -1757,12 +1757,12 @@
/turf/simulated/floor/plasteel,
/area/security/range)
"adS" = (
/obj/structure/closet/syndicate/suits,
/obj/machinery/light/spot{
tag = "icon-tube1 (WEST)";
icon_state = "tube1";
dir = 8
},
/obj/machinery/suit_storage_unit/syndicate/secure,
/turf/simulated/shuttle/floor{
icon_state = "floor4"
},
+2 -2
View File
@@ -12005,8 +12005,8 @@
/area/syndicate_mothership)
"BE" = (
/obj/structure/rack,
/obj/item/storage/backpack/duffel/syndie/ammo/loaded,
/obj/item/storage/backpack/duffel/syndie/ammo/loaded,
/obj/item/storage/backpack/duffel/syndie/ammo/shotgun,
/obj/item/storage/backpack/duffel/syndie/ammo/shotgun,
/obj/item/gun/projectile/automatic/shotgun/bulldog,
/obj/item/gun/projectile/automatic/shotgun/bulldog,
/turf/unsimulated/floor{
+1 -1
View File
@@ -442,7 +442,7 @@
/proc/SecondsToTicks(var/seconds)
return seconds * 10
proc/pollCandidates(Question, be_special_type, antag_age_check = 0, poll_time = 300, ignore_respawnability = 0, min_hours = 0, flashwindow = TRUE, check_antaghud = TRUE)
proc/pollCandidates(Question, be_special_type, antag_age_check = FALSE, poll_time = 300, ignore_respawnability = FALSE, min_hours = 0, flashwindow = TRUE, check_antaghud = TRUE)
var/roletext = be_special_type ? get_roletext(be_special_type) : null
var/list/mob/dead/observer/candidates = list()
var/time_passed = world.time
+1
View File
@@ -1025,6 +1025,7 @@
if(!ticker.mode.equip_syndicate(current))
to_chat(usr, "<span class='warning'>Equipping a syndicate failed!</span>")
return
ticker.mode.update_syndicate_id(current.mind, ticker.mode.syndicates.len == 1)
log_admin("[key_name(usr)] has equipped [key_name(current)] as a nuclear operative")
message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a nuclear operative")
+169 -115
View File
@@ -12,10 +12,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
var/datum/uplink_item/I = new path
if(!I.item)
continue
if(I.gamemodes.len && ticker && !(ticker.mode.type in I.gamemodes))
continue
if(I.excludefrom.len && ticker && (ticker.mode.type in I.excludefrom))
continue
// if(I.gamemodes.len && ticker && !(ticker.mode.type in I.gamemodes))
// continue
// if(I.excludefrom.len && ticker && (ticker.mode.type in I.excludefrom))
// continue
if(I.last)
last += I
continue
@@ -441,7 +441,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/dangerous
category = "Highly Visible and Dangerous Weapons"
/datum/uplink_item/dangerous/pistol
name = "FK-69 Pistol"
reference = "SPI"
@@ -559,37 +558,66 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/batterer
cost = 5
/datum/uplink_item/dangerous/gygax
// SUPPORT AND MECHAS
/datum/uplink_item/support
category = "Support and Mechanized Exosuits"
surplus = 0
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/support/gygax
name = "Gygax Exosuit"
desc = "A lightweight exosuit, painted in a dark scheme. Its speed and equipment selection make it excellent for hit-and-run style attacks. \
This model lacks a method of space propulsion, and therefore it is advised to repair the mothership's teleporter if you wish to make use of it."
reference = "GE"
item = /obj/mecha/combat/gygax/dark/loaded
cost = 90
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
/datum/uplink_item/dangerous/mauler
/datum/uplink_item/support/mauler
name = "Mauler Exosuit"
desc = "A massive and incredibly deadly Syndicate exosuit. Features long-range targeting, thrust vectoring, and deployable smoke."
reference = "ME"
item = /obj/mecha/combat/marauder/mauler/loaded
cost = 140
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
/datum/uplink_item/dangerous/syndieborg
name = "Syndicate Cyborg"
desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel. Comes in Assault, Medical, or Saboteur variants."
reference = "SC"
item = /obj/item/antag_spawner/borg_tele
refund_path = /obj/item/antag_spawner/borg_tele
cost = 50
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
/datum/uplink_item/support/reinforcement
name = "Reinforcement"
desc = "Call in an additional team member. They won't come with any gear, so you'll have to save some telecrystals \
to arm them as well."
reference = "REINF"
item = /obj/item/antag_spawner/nuke_ops
refund_path = /obj/item/antag_spawner/nuke_ops
cost = 25
refundable = TRUE
cant_discount = TRUE
/datum/uplink_item/support/reinforcement/assault_borg
name = "Syndicate Assault Cyborg"
desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel. \
Comes equipped with a self-resupplying LMG, a grenade launcher, energy sword, emag, pinpointer, flash and crowbar."
reference = "SAC"
item = /obj/item/antag_spawner/nuke_ops/borg_tele/assault
refund_path = /obj/item/antag_spawner/nuke_ops/borg_tele/assault
cost = 65
/datum/uplink_item/support/reinforcement/medical_borg
name = "Syndicate Medical Cyborg"
desc = "A combat medical cyborg. Has limited offensive potential, but makes more than up for it with its support capabilities. \
It comes equipped with a nanite hypospray, a medical beamgun, combat defibrillator, full surgical kit including an energy saw, an emag, pinpointer and flash. \
Thanks to its organ storage bag, it can perform surgery as well as any humanoid."
reference = "SMC"
item = /obj/item/antag_spawner/nuke_ops/borg_tele/medical
refund_path = /obj/item/antag_spawner/nuke_ops/borg_tele/medical
cost = 35
/datum/uplink_item/support/reinforcement/saboteur_borg
name = "Syndicate Saboteur Cyborg"
desc = "A streamlined engineering cyborg, equipped with covert modules and engineering equipment. Also incapable of leaving the welder in the shuttle. \
Its chameleon projector lets it disguise itself as a Nanotrasen cyborg, on top it has thermal vision and a pinpointer."
reference = "SSC"
item = /obj/item/antag_spawner/nuke_ops/borg_tele/saboteur
refund_path = /obj/item/antag_spawner/nuke_ops/borg_tele/saboteur
/datum/uplink_item/dangerous/foamsmg
name = "Toy Submachine Gun"
desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade rounds with a 20-round magazine."
@@ -653,15 +681,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/ammo_box/magazine/m10mm/hp
cost = 3
/datum/uplink_item/ammo/ammobag
name = "Bulldog - Shotgun Ammo Grab Bag"
desc = "A duffelbag filled with Bulldog ammo to kit out an entire team, at a discounted price."
reference = "SAGL"
item = /obj/item/storage/backpack/duffel/syndie/ammo/loaded
cost = 10 //bulk buyer's discount. Very useful if you're buying a mech and dont have TC left to buy people non-shotgun guns
gamemodes = list(/datum/game_mode/nuclear)
cant_discount = TRUE
/datum/uplink_item/ammo/bullslug
name = "Bulldog - 12g Slug Magazine"
desc = "An additional 8-round slug magazine for use in the Bulldog shotgun. Now 8 times less likely to shoot your pals."
@@ -694,6 +713,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/bulldog_ammobag
name = "Bulldog - 12g Ammo Duffel Bag"
desc = "A duffel bag filled with enough 12g ammo to supply an entire team, at a discounted price."
reference = "12ADB"
item = /obj/item/storage/backpack/duffel/syndie/ammo/shotgun
cost = 12 // normally 18
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/smg
name = "C-20r - .45 Magazine"
desc = "An additional 20-round .45 magazine for use in the C-20r submachine gun. These bullets pack a lot of punch that can knock most targets down, but do limited overall damage."
@@ -702,6 +729,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/smg_ammobag
name = "C-20r - .45 Ammo Duffel Bag"
desc = "A duffel bag filled with enough .45 ammo to supply an entire team, at a discounted price."
reference = "45ADB"
item = /obj/item/storage/backpack/duffel/syndie/ammo/smg
cost = 14 // normally 20
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/carbine
name = "Carbine - 5.56 Toploader Magazine"
desc = "An additional 30-round 5.56 magazine for use in the M-90gl carbine. These bullets don't have the punch to knock most targets down, but dish out higher overall damage."
@@ -907,12 +942,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/grenade/plastic/c4
cost = 1
/datum/uplink_item/explosives/plastic_explosives_pack
name = "Pack of 5 C-4 Explosives"
desc = "A package containing 5 C-4 Explosives at a discounted price. For when you need that little bit extra for your sabotaging needs."
reference = "C4P"
item = /obj/item/storage/box/syndie_kit/c4
cost = 4
/datum/uplink_item/explosives/c4bag
name = "Bag of C-4 explosives"
desc = "Because sometimes quantity is quality. Contains 10 C-4 plastic explosives."
item = /obj/item/storage/backpack/duffel/syndie/c4
cost = 8 //20% discount!
cant_discount = TRUE
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/explosives/breaching_charge
name = "Composition X-4"
@@ -922,6 +958,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/explosives/x4bag
name = "Bag of X-4 explosives"
desc = "Contains 3 X-4 shaped plastic explosives. Similar to C4, but with a stronger blast that is directional instead of circular. \
X-4 can be placed on a solid surface, such as a wall or window, and it will blast through the wall, injuring anything on the opposite side, while being safer to the user. \
For when you want a controlled explosion that leaves a wider, deeper, hole."
item = /obj/item/storage/backpack/duffel/syndie/x4
cost = 4
cant_discount = TRUE
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/explosives/syndicate_bomb
name = "Syndicate Bomb"
desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 60 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. \
@@ -1361,37 +1407,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/multitool/ai_detect
cost = 1
/datum/uplink_item/device_tools/telecrystal
name = "Raw Telecrystal"
desc = "Telecrystal in its rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
reference = "RTC"
item = /obj/item/stack/telecrystal
cost = 1
surplus = 0
cant_discount = TRUE
/datum/uplink_item/device_tools/telecrystal/five
name = "5 Raw Telecrystals"
desc = "Five telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
reference = "RTCF"
item = /obj/item/stack/telecrystal/five
cost = 5
/datum/uplink_item/device_tools/telecrystal/twenty
name = "20 Raw Telecrystals"
desc = "Twenty telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
reference = "RTCT"
item = /obj/item/stack/telecrystal/twenty
cost = 20
/datum/uplink_item/device_tools/telecrystal/fifty
name = "50 Raw Telecrystals"
desc = "Fifty telecrystals in their rawest and purest form. You know you want that Mauler."
reference = "RTCB"
item = /obj/item/stack/telecrystal/fifty
cost = 50
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/jammer
name = "Radio Jammer"
desc = "This device will disrupt any nearby outgoing radio communication when activated."
@@ -1491,11 +1506,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
category = "Cybernetic Implants"
surplus = 0
gamemodes = list(/datum/game_mode/nuclear)
var/cyber_bundle = FALSE
/datum/uplink_item/cyber_implants/spawn_item(turf/loc, obj/item/uplink/U)
if(item)
if(findtext(item, /obj/item/organ/internal/cyberimp) && !cyber_bundle)
if(findtext(item, /obj/item/organ/internal/cyberimp))
U.uses -= max(cost, 0)
U.used_TC += cost
feedback_add_details("traitor_uplink_items_bought", name) //this one and the line before copypasted because snowflaek code
@@ -1532,16 +1546,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/organ/internal/cyberimp/chest/reviver
cost = 8
/datum/uplink_item/cyber_implants/bundle
name = "Cybernetic Implants Bundle"
desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants. \
Comes with an automated implanting tool."
reference = "CIB"
item = /obj/item/storage/box/cyber_implants/bundle
cost = 40
cyber_bundle = TRUE
cant_discount = TRUE
// POINTLESS BADASSERY
/datum/uplink_item/badass
@@ -1555,15 +1559,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate
cost = 2
/datum/uplink_item/badass/bundle
name = "Syndicate Bundle"
desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 20 telecrystals, but you do not know which specialisation you will receive."
reference = "SYB"
item = /obj/item/storage/box/syndicate
cost = 20
excludefrom = list(/datum/game_mode/nuclear)
cant_discount = TRUE
/datum/uplink_item/badass/syndiecards
name = "Syndicate Playing Cards"
desc = "A special deck of space-grade playing cards with a mono-molecular edge and metal reinforcement, making them lethal weapons both when wielded as a blade and when thrown. \
@@ -1606,50 +1601,80 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 20
gamemodes = list(/datum/game_mode/nuclear)
/*/datum/uplink_item/badass/random
name = "Random Item"
desc = "Picking this choice will send you a random item from the list. Useful for when you cannot think of a strategy to finish your objectives with."
reference = "RAIT"
/datum/uplink_item/bundles_TC
category = "Bundles and Telecrystals"
surplus = 0
cant_discount = TRUE
/datum/uplink_item/bundles_TC/bulldog
name = "Bulldog Bundle"
desc = "Lean and mean: Optimized for people that want to get up close and personal. Contains the popular \
Bulldog shotgun, two 12g buckshot drums, and a pair of Thermal imaging goggles."
reference = "BULB"
item = /obj/item/storage/backpack/duffel/syndie/bulldogbundle
cost = 9 // normally 12
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/bundles_TC/c20r
name = "C-20r Bundle"
desc = "Old Faithful: The classic C-20r, bundled with two magazines and a (surplus) suppressor at discount price."
reference = "C20B"
item = /obj/item/storage/backpack/duffel/syndie/c20rbundle
cost = 14 // normally 17
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/bundles_TC/cyber_implants
name = "Cybernetic Implants Bundle"
desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants. \
Comes with an automated implanting tool."
reference = "CIB"
item = /obj/item/storage/box/cyber_implants/bundle
cost = 40
/datum/uplink_item/bundles_TC/medical
name = "Medical Bundle"
desc = "The support specialist: Aid your fellow operatives with this medical bundle. Contains a tactical medkit, \
a Donksoft LMG and a box of riot darts."
reference = "MEDB"
item = /obj/item/storage/backpack/duffel/syndie/med/medicalbundle
cost = 15 // normally 20
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/bundles_TC/sniper
name = "Sniper bundle"
desc = "Elegant and refined: Contains a collapsed sniper rifle in an expensive carrying case, \
two soporific knockout magazines, a free surplus suppressor, and a sharp-looking tactical turtleneck suit. \
We'll throw in a free red tie if you order NOW."
reference = "SNPB"
item = /obj/item/storage/briefcase/sniperbundle
cost = 18 // normally 23
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/bundles_TC/badass
name = "Syndicate Bundle"
desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 20 telecrystals, but you do not know which specialisation you will receive."
reference = "SYB"
item = /obj/item/storage/box/syndicate
cost = 0
cost = 20
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/badass/random/spawn_item(var/turf/loc, var/obj/item/uplink/U)
var/list/buyable_items = get_uplink_items()
var/list/possible_items = list()
for(var/category in buyable_items)
for(var/datum/uplink_item/I in buyable_items[category])
if(I == src)
continue
if(I.cost > U.uses)
continue
possible_items += I
if(possible_items.len)
var/datum/uplink_item/I = pick(possible_items)
U.uses -= max(0, I.cost)
feedback_add_details("traitor_uplink_items_bought","RN")
return new I.item(loc) */
/datum/uplink_item/badass/surplus_crate
/datum/uplink_item/bundles_TC/surplus_crate
name = "Syndicate Surplus Crate"
desc = "A crate containing 50 telecrystals worth of random syndicate leftovers."
reference = "SYSC"
cost = 20
item = /obj/item/storage/box/syndicate
excludefrom = list(/datum/game_mode/nuclear)
cant_discount = TRUE // You fucking wish
var/crate_value = 50
/datum/uplink_item/badass/surplus_crate/super
/datum/uplink_item/bundles_TC/surplus_crate/super
name = "Syndicate Super Surplus Crate"
desc = "A crate containing 125 telecrystals worth of random syndicate leftovers."
reference = "SYSS"
cost = 40
crate_value = 125
/datum/uplink_item/badass/surplus_crate/spawn_item(turf/loc, obj/item/uplink/U)
/datum/uplink_item/bundles_TC/surplus_crate/spawn_item(turf/loc, obj/item/uplink/U)
var/obj/structure/closet/crate/C = new(loc)
var/list/temp_uplink_list = get_uplink_items()
var/list/buyable_items = list()
@@ -1679,3 +1704,32 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
new item(C)
U.purchase_log += "<BIG>[bicon(item)]</BIG>"
log_game("[key_name(usr)] purchased a surplus crate with [jointext(itemlog, ", ")]")
/datum/uplink_item/bundles_TC/telecrystal
name = "Raw Telecrystal"
desc = "Telecrystal in its rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
reference = "RTC"
item = /obj/item/stack/telecrystal
cost = 1
/datum/uplink_item/bundles_TC/telecrystal/five
name = "5 Raw Telecrystals"
desc = "Five telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
reference = "RTCF"
item = /obj/item/stack/telecrystal/five
cost = 5
/datum/uplink_item/bundles_TC/telecrystal/twenty
name = "20 Raw Telecrystals"
desc = "Twenty telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count."
reference = "RTCT"
item = /obj/item/stack/telecrystal/twenty
cost = 20
/datum/uplink_item/bundles_TC/telecrystal/fifty
name = "50 Raw Telecrystals"
desc = "Fifty telecrystals in their rawest and purest form. You know you want that Mauler."
reference = "RTCB"
item = /obj/item/stack/telecrystal/fifty
cost = 50
gamemodes = list(/datum/game_mode/nuclear)
+15 -21
View File
@@ -1,4 +1,4 @@
#define NUKESCALINGMODIFIER 1
#define NUKESCALINGMODIFIER 1.2
/datum/game_mode
var/list/datum/mind/syndicates = list()
@@ -38,10 +38,7 @@ proc/issyndicate(mob/living/M as mob)
if(possible_syndicates.len < 1)
return 0
var/enough_candidates = LAZYLEN(possible_syndicates) > agents_possible
if(enough_candidates && LAZYLEN(GLOB.clients) >= highpop_trigger)
agent_number = agents_possible_highpop
else if(enough_candidates)
if(LAZYLEN(possible_syndicates) > agents_possible)
agent_number = agents_possible
else
agent_number = possible_syndicates.len
@@ -128,12 +125,7 @@ proc/issyndicate(mob/living/M as mob)
leader_selected = 1
else
synd_mind.current.real_name = "[syndicate_name()] Operative #[agent_number]"
var/list/foundIDs = synd_mind.current.search_contents_for(/obj/item/card/id)
if(foundIDs.len)
for(var/obj/item/card/id/ID in foundIDs)
ID.name = "[syndicate_name()] Operative ID card"
ID.registered_name = synd_mind.current.real_name
update_syndicate_id(synd_mind, FALSE)
agent_number++
spawnpos++
@@ -206,15 +198,7 @@ proc/issyndicate(mob/living/M as mob)
var/obj/item/nuclear_challenge/challenge = new /obj/item/nuclear_challenge
synd_mind.current.equip_to_slot_or_del(challenge, slot_r_hand)
var/list/foundIDs = synd_mind.current.search_contents_for(/obj/item/card/id)
if(foundIDs.len)
for(var/obj/item/card/id/ID in foundIDs)
ID.name = "[syndicate_name()] [leader_title] ID card"
ID.registered_name = synd_mind.current.real_name
ID.access += access_syndicate_leader
else
message_admins("Warning: Nuke Ops spawned without access to leave their spawn area!")
update_syndicate_id(synd_mind, leader_title, TRUE)
if(nuke_code)
synd_mind.store_memory("<B>Syndicate Nuclear Bomb Code</B>: [nuke_code]", 0, 0)
@@ -236,8 +220,18 @@ proc/issyndicate(mob/living/M as mob)
else
nuke_code = "code will be provided later"
return
/datum/game_mode/proc/update_syndicate_id(var/datum/mind/synd_mind, is_leader = FALSE)
var/list/found_ids = synd_mind.current.search_contents_for(/obj/item/card/id)
if(LAZYLEN(found_ids))
for(var/obj/item/card/id/ID in found_ids)
ID.name = "[synd_mind.current.real_name] ID card"
ID.registered_name = synd_mind.current.real_name
if(is_leader)
ID.access += access_syndicate_leader
else
message_admins("Warning: Operative [key_name_admin(synd_mind.current)] spawned without an ID card!")
/datum/game_mode/proc/forge_syndicate_objectives(var/datum/mind/syndicate)
var/datum/objective/nuclear/syndobj = new
+36 -12
View File
@@ -11,11 +11,13 @@
var/obj/item/clothing/suit/space/suit = null
var/obj/item/clothing/head/helmet/space/helmet = null
var/obj/item/clothing/mask/mask = null
var/obj/item/clothing/shoes/magboots/magboots = null
var/obj/item/storage = null
var/helmet_type = null
var/suit_type = null
var/mask_type = null
var/magboots_type = null
var/storage_type = null
var/locked = FALSE
@@ -63,7 +65,7 @@
suit_type = /obj/item/clothing/suit/space/hardsuit/engineering
helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/engineering
mask_type = /obj/item/clothing/mask/breath
storage_type = /obj/item/clothing/shoes/magboots
magboots_type = /obj/item/clothing/shoes/magboots
req_access = list(access_engine_equip)
/obj/machinery/suit_storage_unit/engine/secure
@@ -74,7 +76,7 @@
suit_type = /obj/item/clothing/suit/space/hardsuit/elite
helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/elite
mask_type = /obj/item/clothing/mask/gas
storage_type = /obj/item/clothing/shoes/magboots/advance
magboots_type = /obj/item/clothing/shoes/magboots/advance
req_access = list(access_ce)
/obj/machinery/suit_storage_unit/ce/secure
@@ -85,7 +87,7 @@
suit_type = /obj/item/clothing/suit/space/hardsuit/security
helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/security
mask_type = /obj/item/clothing/mask/gas/sechailer
storage_type = /obj/item/clothing/shoes/magboots
magboots_type = /obj/item/clothing/shoes/magboots
req_access = list(access_security)
/obj/machinery/suit_storage_unit/security/secure
@@ -99,7 +101,7 @@
suit_type = /obj/item/clothing/suit/space/hardsuit/atmos
helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/atmos
mask_type = /obj/item/clothing/mask/gas
storage_type = /obj/item/clothing/shoes/magboots
magboots_type = /obj/item/clothing/shoes/magboots
req_access = list(access_atmospherics)
/obj/machinery/suit_storage_unit/atmos/secure
@@ -128,7 +130,7 @@
/obj/machinery/suit_storage_unit/cmo/secure/sec_storage
name = "medical suit storage unit"
mask_type = /obj/item/clothing/mask/gas
storage_type = /obj/item/clothing/shoes/magboots
magboots_type = /obj/item/clothing/shoes/magboots
/obj/machinery/suit_storage_unit/clown
name = "clown suit storage unit"
@@ -150,13 +152,13 @@
/obj/machinery/suit_storage_unit/syndicate
name = "syndicate suit storage unit"
suit_type = /obj/item/clothing/suit/space/hardsuit/syndi
helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/syndi
mask_type = /obj/item/clothing/mask/gas/syndicate
storage_type = /obj/item/tank/jetpack/oxygen/harness
suit_type = /obj/item/clothing/suit/space/hardsuit/syndi
helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/syndi
mask_type = /obj/item/clothing/mask/gas/syndicate
magboots_type = /obj/item/clothing/shoes/magboots/syndie
storage_type = /obj/item/tank/jetpack/oxygen/harness
req_access = list(access_syndicate)
safeties = FALSE //in a syndicate base, everything can be used as a murder weapon at a moment's notice.
uv_super = TRUE //so efficient
/obj/machinery/suit_storage_unit/syndicate/secure
secure = TRUE
@@ -245,6 +247,8 @@
helmet = new helmet_type(src)
if(mask_type)
mask = new mask_type(src)
if(magboots_type)
magboots = new magboots_type(src)
if(storage_type)
storage = new storage_type(src)
update_icon()
@@ -257,6 +261,7 @@
QDEL_NULL(suit)
QDEL_NULL(helmet)
QDEL_NULL(mask)
QDEL_NULL(magboots)
QDEL_NULL(storage)
QDEL_NULL(wires)
return ..()
@@ -324,7 +329,10 @@
if(istype(I, /obj/item/clothing/mask) && !mask)
mask = I
. = TRUE
if((istype(I, /obj/item/tank) || istype(I, /obj/item/clothing/shoes/magboots)) && !storage)
if(istype(I, /obj/item/clothing/shoes/magboots) && !magboots)
magboots = I
. = TRUE
if((istype(I, /obj/item/tank)) && !storage)
storage = I
. = TRUE
if(.)
@@ -410,6 +418,8 @@
qdel(suit) // Delete everything but the occupant.
mask = null
qdel(mask)
magboots = null
qdel(magboots)
storage = null
qdel(storage)
else
@@ -544,7 +554,10 @@
dat+= text("Breathmask storage compartment: <B>[]</B><BR>",(mask ? mask.name : "</font><font color ='grey'>No breathmask detected.") )
if(mask && state_open)
dat+="<A href='?src=[UID()];dispense_mask=1'>Dispense mask</A><BR>"
dat+= text("Tank, Magboots storage compartment: <B>[]</B><BR>",(storage ? storage.name : "</font><font color ='grey'>No storage item detected.") )
dat+= text("Magboots storage compartment: <B>[]</B><BR>",(magboots ? magboots.name : "</font><font color ='grey'>No magboots detected.") )
if(magboots && state_open)
dat+="<A href='?src=[UID()];dispense_magboots=1'>Dispense magboots</A><BR>"
dat+= text("Tank storage compartment: <B>[]</B><BR>",(storage ? storage.name : "</font><font color ='grey'>No storage item detected.") )
if(storage && state_open)
dat+="<A href='?src=[UID()];dispense_storage=1'>Dispense storage item</A><BR>"
if(occupant)
@@ -604,6 +617,10 @@
dispense_mask(usr)
updateUsrDialog()
update_icon()
if(href_list["dispense_magboots"])
dispense_magboots(usr)
updateUsrDialog()
update_icon()
if(href_list["dispense_storage"])
dispense_storage(usr)
updateUsrDialog()
@@ -671,6 +688,13 @@
else
mask.forceMove(loc)
mask = null
/obj/machinery/suit_storage_unit/proc/dispense_magboots(mob/user as mob)
if(!magboots)
return
else
magboots.forceMove(loc)
magboots = null
/obj/machinery/suit_storage_unit/proc/dispense_storage(mob/user as mob)
if(!storage)
@@ -315,7 +315,7 @@
/obj/item/storage/backpack/duffel/syndie
name = "suspicious looking duffelbag"
desc = "A large duffelbag for holding extra tactical supplies."
icon_state = "duffel-syndi"
icon_state = "duffel-syndie"
item_state = "duffel-syndimed"
origin_tech = "syndicate=1"
silent = 1
@@ -333,21 +333,64 @@
icon_state = "duffel-syndiammo"
item_state = "duffel-syndiammo"
/obj/item/storage/backpack/duffel/syndie/ammo/loaded
/obj/item/storage/backpack/duffel/syndie/ammo/shotgun
desc = "A large duffelbag, packed to the brim with Bulldog shotgun ammo."
/obj/item/storage/backpack/duffel/syndie/ammo/loaded/New()
/obj/item/storage/backpack/duffel/syndie/ammo/shotgun/New()
..()
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
for(var/i in 1 to 6)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g/buckshot(src)
new /obj/item/ammo_box/magazine/m12g/buckshot(src)
new /obj/item/ammo_box/magazine/m12g/stun(src)
new /obj/item/ammo_box/magazine/m12g/dragon(src)
/obj/item/storage/backpack/duffel/syndie/ammo/smg
desc = "A large duffel bag, packed to the brim with C-20r magazines."
/obj/item/storage/backpack/duffel/syndie/ammo/smg/New()
..()
for(var/i in 1 to 10)
new /obj/item/ammo_box/magazine/smgm45(src)
/obj/item/storage/backpack/duffel/syndie/c20rbundle
desc = "A large duffel bag containing a C-20r, some magazines, and a cheap looking suppressor."
/obj/item/storage/backpack/duffel/syndie/c20rbundle/New()
..()
new /obj/item/ammo_box/magazine/smgm45(src)
new /obj/item/ammo_box/magazine/smgm45(src)
new /obj/item/gun/projectile/automatic/c20r(src)
new /obj/item/suppressor/specialoffer(src)
/obj/item/storage/backpack/duffel/syndie/bulldogbundle
desc = "A large duffel bag containing a Bulldog, some drums, and a pair of thermal imaging glasses."
/obj/item/storage/backpack/duffel/syndie/bulldogbundle/New()
..()
new /obj/item/gun/projectile/automatic/shotgun/bulldog(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/clothing/glasses/thermal/syndi(src)
/obj/item/storage/backpack/duffel/syndie/med/medicalbundle
desc = "A large duffel bag containing a tactical medkit, a Donksoft machine gun and a big jumbo box of riot darts."
/obj/item/storage/backpack/duffel/syndie/med/medicalbundle/New()
..()
new /obj/item/storage/firstaid/tactical(src)
new /obj/item/gun/projectile/automatic/l6_saw/toy(src)
new /obj/item/ammo_box/foambox/riot(src)
/obj/item/storage/backpack/duffel/syndie/c4/New()
..()
for(var/i in 1 to 10)
new /obj/item/grenade/plastic/c4(src)
/obj/item/storage/backpack/duffel/syndie/x4/New()
..()
for(var/i in 1 to 3)
new /obj/item/grenade/plastic/x4(src)
/obj/item/storage/backpack/duffel/syndie/surgery
name = "surgery duffelbag"
desc = "A suspicious looking duffelbag for holding surgery tools."
@@ -15,5 +15,15 @@
burn_state = FLAMMABLE
burntime = 20
/obj/item/storage/briefcase/New()
..()
/obj/item/storage/briefcase/sniperbundle
desc = "Its label reads \"genuine hardened Captain leather\", but suspiciously has no other tags or branding. Smells like L'Air du Temps."
force = 10
/obj/item/storage/briefcase/sniperbundle/New()
..()
new /obj/item/gun/projectile/automatic/sniper_rifle/syndicate(src)
new /obj/item/clothing/accessory/red(src)
new /obj/item/clothing/under/syndicate/sniper(src)
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src)
new /obj/item/suppressor/specialoffer(src)
@@ -10,72 +10,91 @@
/obj/item/antag_spawner/proc/equip_antag(mob/target)
return
/obj/item/antag_spawner/borg_tele
name = "syndicate cyborg teleporter"
desc = "A single-use teleporter used to deploy a Syndicate Cyborg on the field."
///////////BORGS AND OPERATIVES
/obj/item/antag_spawner/nuke_ops
name = "syndicate operative teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field."
icon = 'icons/obj/device.dmi'
icon_state = "locator"
var/checking = FALSE
var/TC_cost = 0
var/borg_to_spawn
var/upload_mind
var/list/possible_types = list("Assault", "Medical", "Saboteur")
var/checking = FALSE
/obj/item/antag_spawner/borg_tele/attack_self(mob/user)
/obj/item/antag_spawner/nuke_ops/proc/check_usability(mob/user)
if(used)
to_chat(user, "<span class='warning'>[src] is out of power!</span>")
return
return FALSE
if(!(user.mind in ticker.mode.syndicates))
to_chat(user, "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>")
return FALSE
if(checking)
to_chat(user, "<span class='warning'>[src] is already checking for possible borgs.</span>")
return
borg_to_spawn = input("What type of borg would you like to teleport?", "Cyborg Type", type) as null|anything in possible_types
if(!borg_to_spawn || checking || used)
return
upload_mind = input("Would you like to continue playing as an operative or take over the cyborg? (Another player will control your old self)", "Play as") as null|anything in list("Nuclear Operative", "Syndicate Cyborg")
if(!upload_mind || checking || used)
return
if(upload_mind == "Nuclear Operative")
checking = TRUE
to_chat(user, "<span class='notice'>The device is now checking for possible borgs.</span>")
var/list/borg_candidates = pollCandidates("Do you want to play as a Syndicate [borg_to_spawn] borg?", ROLE_OPERATIVE, 1)
if(borg_candidates.len > 0 && !used)
checking = FALSE
used = TRUE
var/mob/M = pick(borg_candidates)
var/client/C = M.client
spawn_antag(C, get_turf(loc), "syndieborg")
qdel(src)
else
checking = FALSE
to_chat(user, "<span class='notice'>Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.</span>")
return
else if(upload_mind == "Syndicate Cyborg")
checking = TRUE
to_chat(user, "<span class='notice'>You attempt to upload your consciousness into a new syndicate cyborg.</span>")
var/list/nuclear_candidates = pollCandidates("Do you want to play as the Syndicate Nuclear Operative [user.real_name]?", ROLE_OPERATIVE, 1)
if(nuclear_candidates.len > 0 && !used)
checking = FALSE
used = TRUE
var/mob/M = pick(nuclear_candidates)
var/client/nukeop_client = M.client
var/client/borg_client = user.client
spawn_antag(borg_client, get_turf(loc), "syndieborg")
user.key = nukeop_client.key
ticker.mode.greet_syndicate(user.mind)
qdel(src)
else
checking = FALSE
to_chat(user, "<span class='notice'>Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.</span>")
return
to_chat(user, "<span class='danger'>The device is already connecting to Syndicate command. Please wait.</span>")
return FALSE
return TRUE
/obj/item/antag_spawner/borg_tele/spawn_antag(client/C, turf/T, type = "")
if(!borg_to_spawn) //If there's no type at all, let it still be used but don't do anything
/obj/item/antag_spawner/nuke_ops/attack_self(mob/user)
if(!(check_usability(user)))
return
checking = TRUE
to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>")
var/list/nuke_candidates = pollCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg" : "operative"]?", ROLE_OPERATIVE, TRUE, 150)
if(LAZYLEN(nuke_candidates))
checking = FALSE
if(QDELETED(src) || !check_usability(user))
return
used = TRUE
var/mob/dead/observer/G = pick(nuke_candidates)
spawn_antag(G.client, get_turf(src), user.mind)
do_sparks(4, TRUE, src)
qdel(src)
else
checking = FALSE
to_chat(user, "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>")
/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
var/agent_number = LAZYLEN(ticker.mode.syndicates)
M.real_name = "[syndicate_name()] Operative #[agent_number]"
set_syndicate_values(C, M)
/obj/item/antag_spawner/nuke_ops/proc/set_syndicate_values(client/C, mob/living/M)
M.key = C.key
ticker.mode.syndicates += M.mind
ticker.mode.update_synd_icons_added(M.mind)
M.mind.assigned_role = SPECIAL_ROLE_NUKEOPS
M.mind.special_role = SPECIAL_ROLE_NUKEOPS
M.mind.offstation_role = TRUE
M.faction = list("syndicate")
ticker.mode.greet_syndicate(M.mind)
//////SYNDICATE BORG
/obj/item/antag_spawner/nuke_ops/borg_tele
name = "syndicate cyborg teleporter"
desc = "A single-use teleporter designed to quickly reinforce operatives in the field."
/obj/item/antag_spawner/nuke_ops/borg_tele/assault
name = "syndicate assault cyborg teleporter"
borg_to_spawn = "Assault"
/obj/item/antag_spawner/nuke_ops/borg_tele/medical
name = "syndicate medical teleporter"
borg_to_spawn = "Medical"
/obj/item/antag_spawner/nuke_ops/borg_tele/saboteur
name = "syndicate saboteur teleporter"
borg_to_spawn = "Saboteur"
/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, datum/mind/user)
if(!(user in ticker.mode.syndicates))
used = FALSE
return
do_sparks(4, 1, src)
var/mob/living/silicon/robot/R
switch(borg_to_spawn)
if("Medical")
@@ -84,11 +103,22 @@
R = new /mob/living/silicon/robot/syndicate/saboteur(T)
else
R = new /mob/living/silicon/robot/syndicate(T) //Assault borg by default
R.key = C.key
ticker.mode.syndicates += R.mind
ticker.mode.update_synd_icons_added(R.mind)
R.mind.special_role = SPECIAL_ROLE_NUKEOPS
R.faction = list("syndicate")
var/brainfirstname = pick(GLOB.first_names_male)
if(prob(50))
brainfirstname = pick(GLOB.first_names_female)
var/brainopslastname = pick(GLOB.last_names)
if(syndicate_name()) //the brain inside the syndiborg has the same last name as the other ops.
brainopslastname = syndicate_name()
var/brainopsname = "[brainfirstname] [brainopslastname]"
R.mmi.name = "[initial(R.mmi.name)]: [brainopsname]"
R.mmi.brainmob.real_name = brainopsname
R.mmi.brainmob.name = brainopsname
set_syndicate_values(C, R)
///////////SLAUGHTER DEMON
/obj/item/antag_spawner/slaughter_demon //Warning edgiest item in the game
name = "vial of blood"
@@ -159,6 +189,8 @@
objective_verb = "Hug and Tickle"
demon_type = /mob/living/simple_animal/slaughter/laughter
///////////MORPH
/obj/item/antag_spawner/morph
name = "vial of ooze"
desc = "A magically infused bottle of ooze, distilled by methods rather not be spoken of. Used to awaken an all-consuming monstrosity."
+8 -1
View File
@@ -16,4 +16,11 @@
icon_state = "tactifool"
item_state = "bl_suit"
item_color = "tactifool"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/syndicate/sniper
name = "Tactical turtleneck suit"
desc = "A double seamed tactical turtleneck disguised as a civilian grade silk suit. Intended for the most formal operator. The collar is really sharp."
icon_state = "really_black_suit"
item_state = "bl_suit"
item_color = "black_suit"
@@ -441,6 +441,9 @@
/obj/item/robot_module/syndicate_saboteur
name = "engineering robot module" //to disguise in examine
module_type = "Malf"
module_actions = list(
/datum/action/innate/robot_sight/thermal,
)
stacktypes = list(
/obj/item/stack/sheet/metal/cyborg = 50,