mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-19 19:13:30 +01:00
merge conflict fix, reset map
This commit is contained in:
@@ -13,12 +13,14 @@
|
||||
#define DISABILITY_FLAG_BLIND 16
|
||||
#define DISABILITY_FLAG_MUTE 32
|
||||
#define DISABILITY_FLAG_COLOURBLIND 64
|
||||
#define DISABILITY_FLAG_WINGDINGS 128
|
||||
#define DISABILITY_FLAG_TOURETTES 512
|
||||
#define DISABILITY_FLAG_NERVOUS 1024
|
||||
#define DISABILITY_FLAG_SWEDISH 2048
|
||||
#define DISABILITY_FLAG_SCRAMBLED 4096 // incoherent speech
|
||||
#define DISABILITY_FLAG_LISP 8192
|
||||
#define DISABILITY_FLAG_DIZZY 16384
|
||||
|
||||
///////////////////////////////////////
|
||||
// MUTATIONS
|
||||
///////////////////////////////////////
|
||||
@@ -33,10 +35,12 @@
|
||||
#define HUSK 7
|
||||
#define NOCLONE 8
|
||||
|
||||
|
||||
// Extra powers:
|
||||
#define LASER 9 // harm intent - click anywhere to shoot lasers from eyes
|
||||
|
||||
//species mutation
|
||||
#define WINGDINGS 10 // Ayy lmao
|
||||
|
||||
//2spooky
|
||||
#define SKELETON 29
|
||||
#define PLANT 30
|
||||
@@ -143,4 +147,5 @@
|
||||
#define NOCRITDAMAGE 15
|
||||
#define RESISTHOT 16
|
||||
#define RESISTCOLD 17
|
||||
#define NO_EXAMINE 18
|
||||
#define NO_EXAMINE 18
|
||||
#define CAN_WINGDINGS 19
|
||||
@@ -0,0 +1,8 @@
|
||||
#define BSA_SIZE_FRONT 4
|
||||
#define BSA_SIZE_BACK 6
|
||||
|
||||
#define VAULT_SPACEIMMUNE "Space Immunity"
|
||||
#define VAULT_XRAY "X-Ray Vision"
|
||||
#define VAULT_TELEKINESIS "Telekinesis"
|
||||
#define VAULT_PSYCHIC "Psychic Powers"
|
||||
#define VAULT_SPEED "Speediness"
|
||||
@@ -47,7 +47,11 @@
|
||||
if(IS_WHITELISTED in S.species_traits)
|
||||
GLOB.whitelisted_species += S.name
|
||||
|
||||
init_subtypes(/datum/crafting_recipe, GLOB.crafting_recipes)
|
||||
for(var/D in subtypesof(/datum/crafting_recipe))
|
||||
var/datum/crafting_recipe/R = D
|
||||
if(!initial(R.roundstart_enabled))
|
||||
continue
|
||||
GLOB.crafting_recipes += new R
|
||||
|
||||
//Pipe list building
|
||||
init_subtypes(/datum/pipes, GLOB.construction_pipe_list)
|
||||
|
||||
@@ -13,6 +13,7 @@ var/GLASSESBLOCK = 0
|
||||
var/EPILEPSYBLOCK = 0
|
||||
var/TWITCHBLOCK = 0
|
||||
var/NERVOUSBLOCK = 0
|
||||
var/WINGDINGSBLOCK = 0
|
||||
var/MONKEYBLOCK = 50 // Monkey block will always be the DNA_SE_LENGTH
|
||||
|
||||
var/BLOCKADD = 0
|
||||
|
||||
@@ -34,6 +34,7 @@ GLOBAL_LIST_INIT(beacons, list())
|
||||
GLOBAL_LIST_INIT(shuttle_caller_list, list()) //list of all communication consoles, comms consoles circuit and AIs, for automatic shuttle calls when there are none.
|
||||
GLOBAL_LIST_INIT(tracked_implants, list()) //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented...
|
||||
GLOBAL_LIST_INIT(pinpointer_list, list()) //list of all pinpointers. Used to change stuff they are pointing to all at once.
|
||||
GLOBAL_LIST_INIT(nuclear_uplink_list, list()) //list of all existing nuke ops uplinks
|
||||
GLOBAL_LIST_INIT(abductor_equipment, list()) //list of all abductor equipment
|
||||
|
||||
GLOBAL_LIST_INIT(global_intercoms, list()) //list of all intercomms, across all z-levels
|
||||
|
||||
@@ -322,7 +322,7 @@ Recharging stations are available in robotics, the dormitory bathrooms, and the
|
||||
|
||||
/obj/screen/alert/nymph/Click()
|
||||
if(!usr || !usr.client)
|
||||
return
|
||||
return
|
||||
if(isnymph(usr))
|
||||
var/mob/living/simple_animal/diona/D = usr
|
||||
return D.resist()
|
||||
@@ -412,6 +412,26 @@ so as to remain in compliance with the most up-to-date laws."
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>[M] is not connected to a port at the moment.</span>")
|
||||
|
||||
/obj/screen/alert/mech_nocell
|
||||
name = "Missing Power Cell"
|
||||
desc = "Mech has no power cell."
|
||||
icon_state = "nocell"
|
||||
|
||||
/obj/screen/alert/mech_emptycell
|
||||
name = "Out of Power"
|
||||
desc = "Mech is out of power."
|
||||
icon_state = "emptycell"
|
||||
|
||||
/obj/screen/alert/mech_lowcell
|
||||
name = "Low Charge"
|
||||
desc = "Mech is running out of power."
|
||||
icon_state = "lowcell"
|
||||
|
||||
/obj/screen/alert/mech_maintenance
|
||||
name = "Maintenance Protocols"
|
||||
desc = "Maintenance protocols are currently in effect, most actions disabled."
|
||||
icon_state = "locked"
|
||||
|
||||
//GUARDIANS
|
||||
/obj/screen/alert/cancharge
|
||||
name = "Charge Ready"
|
||||
|
||||
@@ -83,12 +83,12 @@
|
||||
l_ear = /obj/item/radio/headset/syndicate/alt
|
||||
glasses = /obj/item/clothing/glasses/night
|
||||
shoes = /obj/item/clothing/shoes/magboots/syndie
|
||||
r_pocket = /obj/item/radio/uplink/nuclear
|
||||
l_pocket = /obj/item/pinpointer/advpinpointer
|
||||
l_hand = /obj/item/tank/jetpack/oxygen/harness
|
||||
|
||||
backpack_contents = list(
|
||||
/obj/item/storage/box/engineer = 1,
|
||||
/obj/item/reagent_containers/food/pill/initropidril = 1,
|
||||
/obj/item/storage/box/survival_syndi = 1,
|
||||
/obj/item/gun/projectile/automatic/pistol = 1,
|
||||
/obj/item/ammo_box/magazine/m10mm = 1,
|
||||
/obj/item/crowbar/red = 1,
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
|
||||
action_icon_state = "mime"
|
||||
action_background_icon_state = "bg_mime"
|
||||
large = TRUE
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/forcewall/mime/Click()
|
||||
if(usr && usr.mind)
|
||||
|
||||
@@ -185,49 +185,41 @@
|
||||
sound1 = 'sound/magic/Teleport_diss.ogg'
|
||||
sound2 = 'sound/magic/Teleport_app.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
|
||||
name = "Forcewall"
|
||||
desc = "This spell creates an unbreakable wall that lasts for 30 seconds and does not need wizard garb."
|
||||
|
||||
school = "transmutation"
|
||||
charge_max = 100
|
||||
clothes_req = 0
|
||||
invocation = "TARCOL MINTI ZHERI"
|
||||
invocation_type = "whisper"
|
||||
range = 0
|
||||
cooldown_min = 50 //12 deciseconds reduction per rank
|
||||
|
||||
summon_type = list("/obj/effect/forcefield")
|
||||
summon_lifespan = 300
|
||||
|
||||
action_icon_state = "shield"
|
||||
cast_sound = 'sound/magic/ForceWall.ogg'
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/forcewall
|
||||
name = "Greater Forcewall"
|
||||
desc = "Create a magical barrier that only you can pass through."
|
||||
name = "Force Wall"
|
||||
desc = "This spell creates a small unbreakable wall that only you can pass through, and does not need wizard garb. Lasts 30 seconds."
|
||||
|
||||
school = "transmutation"
|
||||
charge_max = 100
|
||||
clothes_req = FALSE
|
||||
invocation = "TARCOL MINTI ZHERI"
|
||||
invocation_type = "shout"
|
||||
invocation_type = "whisper"
|
||||
sound = 'sound/magic/ForceWall.ogg'
|
||||
action_icon_state = "shield"
|
||||
range = -1
|
||||
include_user = TRUE
|
||||
cooldown_min = 50 //12 deciseconds reduction per rank
|
||||
var/wall_type = /obj/effect/forcefield/wizard
|
||||
var/large = FALSE
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/forcewall/cast(list/targets,mob/user = usr)
|
||||
new wall_type(get_turf(user),user)
|
||||
if(user.dir == SOUTH || user.dir == NORTH)
|
||||
new wall_type(get_step(user, EAST),user)
|
||||
new wall_type(get_step(user, WEST),user)
|
||||
else
|
||||
new wall_type(get_step(user, NORTH),user)
|
||||
new wall_type(get_step(user, SOUTH),user)
|
||||
/obj/effect/proc_holder/spell/targeted/forcewall/cast(list/targets, mob/user = usr)
|
||||
new wall_type(get_turf(user), user)
|
||||
if(large) //Extra THICK
|
||||
if(user.dir == SOUTH || user.dir == NORTH)
|
||||
new wall_type(get_step(user, EAST), user)
|
||||
new wall_type(get_step(user, WEST), user)
|
||||
else
|
||||
new wall_type(get_step(user, NORTH), user)
|
||||
new wall_type(get_step(user, SOUTH), user)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/forcewall/greater
|
||||
name = "Greater Force Wall"
|
||||
desc = "Create a larger magical barrier that only you can pass through, but requires wizard garb. Lasts 30 seconds."
|
||||
|
||||
clothes_req = TRUE
|
||||
invocation = "TARCOL GRANDI ZHERI"
|
||||
invocation_type = "shout"
|
||||
large = TRUE
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop
|
||||
name = "Stop Time"
|
||||
|
||||
@@ -184,8 +184,8 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
|
||||
//mime
|
||||
/datum/uplink_item/jobspecific/caneshotgun
|
||||
name = "Cane Shotgun + Assassination Darts"
|
||||
desc = "A specialized, one shell shotgun with a built-in cloaking device to mimic a cane. The shotgun is capable of hiding it's contents and the pin alongside being supressed. Comes with 6 special darts and a preloaded shrapnel round."
|
||||
name = "Cane Shotgun and Assassination Shells"
|
||||
desc = "A specialised, one shell shotgun with a built-in cloaking device to mimic a cane. The shotgun is capable of hiding it's contents and the pin alongside being supressed. Comes boxed with 6 specialised shrapnel rounds laced with a silencing toxin and 1 preloaded in the shotgun's chamber."
|
||||
reference = "MCS"
|
||||
item = /obj/item/storage/box/syndie_kit/caneshotgun
|
||||
cost = 10
|
||||
@@ -1328,6 +1328,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
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."
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
/datum/wires/suitstorage
|
||||
holder_type = /obj/machinery/suit_storage_unit
|
||||
wire_count = 8
|
||||
|
||||
var/const/SSU_WIRE_ID = 1
|
||||
var/const/SSU_WIRE_SHOCK = 2
|
||||
var/const/SSU_WIRE_SAFETY = 4
|
||||
var/const/SSU_WIRE_UV = 8
|
||||
|
||||
|
||||
/datum/wires/suitstorage/GetWireName(index)
|
||||
switch(index)
|
||||
if(SSU_WIRE_ID)
|
||||
return "ID lock"
|
||||
if(SSU_WIRE_SHOCK)
|
||||
return "Shock wire"
|
||||
if(SSU_WIRE_SAFETY)
|
||||
return "Safety wire"
|
||||
if(SSU_WIRE_UV)
|
||||
return "UV wire"
|
||||
|
||||
|
||||
/datum/wires/suitstorage/get_status()
|
||||
. = ..()
|
||||
var/obj/machinery/suit_storage_unit/A = holder
|
||||
. += "The blue light is [A.secure ? "on" : "off"]."
|
||||
. += "The red light is [A.safeties ? "off" : "blinking"]."
|
||||
. += "The green light is [A.shocked ? "on" : "off"]."
|
||||
. += "The UV display shows [A.uv_super ? "15 nm" : "185 nm"]."
|
||||
|
||||
datum/wires/suitstorage/CanUse()
|
||||
var/obj/machinery/suit_storage_unit/A = holder
|
||||
if(A.panel_open)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/wires/suitstorage/UpdateCut(index, mended)
|
||||
var/obj/machinery/suit_storage_unit/A = holder
|
||||
switch(index)
|
||||
if(SSU_WIRE_ID)
|
||||
A.secure = mended
|
||||
if(SSU_WIRE_SAFETY)
|
||||
A.safeties = mended
|
||||
if(SSU_WIRE_SHOCK)
|
||||
A.shocked = !mended
|
||||
A.shock(usr, 50)
|
||||
if(SSU_WIRE_UV)
|
||||
A.uv_super = !mended
|
||||
..()
|
||||
|
||||
datum/wires/suitstorage/UpdatePulsed(index)
|
||||
var/obj/machinery/suit_storage_unit/A = holder
|
||||
if(IsIndexCut(index))
|
||||
return
|
||||
switch(index)
|
||||
if(SSU_WIRE_ID)
|
||||
A.secure = !A.secure
|
||||
if(SSU_WIRE_SAFETY)
|
||||
A.safeties = !A.safeties
|
||||
if(SSU_WIRE_SHOCK)
|
||||
A.shocked = !A.shocked
|
||||
if(A.shocked)
|
||||
A.shock(usr, 100)
|
||||
spawn(50)
|
||||
if(A && !IsIndexCut(index))
|
||||
A.shocked = FALSE
|
||||
if(SSU_WIRE_UV)
|
||||
A.uv_super = !A.uv_super
|
||||
..()
|
||||
@@ -100,6 +100,7 @@ var/global/list/bad_blocks[0]
|
||||
var/real_name // Stores the real name of the person who originally got this dna datum. Used primarily for changelings,
|
||||
|
||||
var/datum/species/species = new /datum/species/human //The type of mutant race the player is if applicable (i.e. potato-man)
|
||||
var/list/default_blocks = list() //list of all blocks toggled at roundstart
|
||||
|
||||
// Make a copy of this strand.
|
||||
// USE THIS WHEN COPYING STUFF OR YOU'LL GET CORRUPTION!
|
||||
|
||||
@@ -190,3 +190,15 @@
|
||||
|
||||
/datum/dna/gene/disability/comic/New()
|
||||
block = COMICBLOCK
|
||||
|
||||
/datum/dna/gene/disability/wingdings
|
||||
name = "Alien Voice"
|
||||
desc = "Garbles the subject's voice into an incomprehensible speech."
|
||||
activation_message = "<span class='wingdings'>Your vocal cords feel alien.</span>"
|
||||
deactivation_message = "Your vocal cords no longer feel alien."
|
||||
instability = -GENE_INSTABILITY_MINOR
|
||||
mutation = WINGDINGS
|
||||
|
||||
/datum/dna/gene/disability/wingdings/New()
|
||||
block = WINGDINGSBLOCK
|
||||
|
||||
|
||||
@@ -243,6 +243,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
||||
var/changeling_speak = 0
|
||||
var/datum/dna/chosen_dna
|
||||
var/obj/effect/proc_holder/changeling/sting/chosen_sting
|
||||
var/regenerating = FALSE
|
||||
|
||||
/datum/changeling/New(gender=FEMALE)
|
||||
..()
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
user.med_hud_set_health()
|
||||
user.handle_hud_icons_health()
|
||||
user.med_hud_set_status()
|
||||
|
||||
user.mind.changeling.regenerating = TRUE
|
||||
|
||||
addtimer(CALLBACK(src, .proc/ready_to_regenerate, user), LING_FAKEDEATH_TIME)
|
||||
feedback_add_details("changeling_powers","FD")
|
||||
return 1
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
user.updatehealth("revive sting")
|
||||
user.update_blind_effects()
|
||||
user.update_blurry_effects()
|
||||
user.mind.changeling.regenerating = FALSE
|
||||
|
||||
to_chat(user, "<span class='notice'>We have regenerated.</span>")
|
||||
|
||||
|
||||
@@ -19,10 +19,6 @@
|
||||
|
||||
user.changeling_update_languages(changeling.absorbed_languages)
|
||||
|
||||
if(user.mind.speech_span == "wingdings") //greys' wingdings isn't stored in DNA
|
||||
user.mind.speech_span = ""
|
||||
to_chat(user, "<span class='warning'>Our vocal cords have permanently shifted. We will now speak regularly.</span>")
|
||||
|
||||
feedback_add_details("changeling_powers","TR")
|
||||
return 1
|
||||
|
||||
|
||||
@@ -36,7 +36,6 @@
|
||||
var/list/datum/mind/xenos = list()
|
||||
|
||||
var/list/datum/station_goal/station_goals = list() // A list of all station goals for this game mode
|
||||
var/list/chumps = list()
|
||||
|
||||
/datum/game_mode/proc/announce() //to be calles when round starts
|
||||
to_chat(world, "<B>Notice</B>: [src] did not define announce()")
|
||||
@@ -69,7 +68,6 @@
|
||||
///post_setup()
|
||||
///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things
|
||||
/datum/game_mode/proc/post_setup()
|
||||
setup_chumps()
|
||||
|
||||
spawn (ROUNDSTART_LOGOUT_REPORT_TIME)
|
||||
display_roundstart_logout_report()
|
||||
@@ -85,40 +83,6 @@
|
||||
start_state.count()
|
||||
return 1
|
||||
|
||||
//setup_chumps()
|
||||
//Prepares fake potential collaborators to cut down on metagaming the round type as being a traitor subtype. Overriden in traitor game modes since they have real collaborators
|
||||
/datum/game_mode/proc/setup_chumps()
|
||||
var/max_chumps = 1
|
||||
if(config.traitor_scaling)
|
||||
max_chumps = max(1, round((num_players())/(5)))
|
||||
else
|
||||
max_chumps = max(1, min(num_players(), 5))
|
||||
var/tries_left = 5 //limits the number of tries so we don't get stuck looping indefinitely. resets on successfully finding a new chump
|
||||
while(chumps.len < max_chumps)
|
||||
if(!tries_left) //ran out of unique chumps (or just bad luck with the pick() in get_nt_opposed()) so there may end up being fewer chumps in some rounds.
|
||||
break
|
||||
var/mob/living/carbon/human/chump = get_nt_opposed()
|
||||
if(isnull(chump)) //no possible chumps so just end it here.
|
||||
break
|
||||
if(chump in chumps)
|
||||
tries_left-- //this chump already was picked, try again!
|
||||
else
|
||||
chumps += chump
|
||||
tries_left = 5 //reset our tries since we found a new chump
|
||||
//make sure we have chumps before we try misinforming them. if we don't make a note of it.
|
||||
if(!chumps.len)
|
||||
log_debug("Game mode failed to find ANY chumps. This is likely due to the server being in extreme low-pop with no one set to opposed or skeptical.")
|
||||
return 0
|
||||
//we've got chumps! misinform them!
|
||||
for(var/mob/living/carbon/human/chump in chumps)
|
||||
if(prob(33))
|
||||
spawn(rand(3000, 18000)) //5-30 minute delay to throw off would-be autotraitor metagamers
|
||||
inform_collab(chump)
|
||||
else
|
||||
spawn(rand(10, 100)) //same delay as if the mode were traitor
|
||||
inform_collab(chump)
|
||||
return 1
|
||||
|
||||
///process()
|
||||
///Called by the gameticker
|
||||
/datum/game_mode/proc/process()
|
||||
@@ -426,23 +390,6 @@ proc/display_roundstart_logout_report()
|
||||
if(check_rights(R_ADMIN, 0, M))
|
||||
to_chat(M, msg)
|
||||
|
||||
|
||||
/proc/get_nt_opposed()
|
||||
var/list/dudes = list()
|
||||
for(var/mob/living/carbon/human/man in GLOB.player_list)
|
||||
if(man.client)
|
||||
//don't try picking someone like the captain or a security officer for potential collaborators, even if they ARE opposed to Nanotrasen for some reason
|
||||
if(man.mind && man.mind.assigned_role)
|
||||
if((man.mind.assigned_role in ticker.mode.protected_jobs) || (man.mind.assigned_role in ticker.mode.restricted_jobs))
|
||||
continue
|
||||
if(man.client.prefs.nanotrasen_relation == "Opposed")
|
||||
dudes += man
|
||||
else if(man.client.prefs.nanotrasen_relation == "Skeptical" && prob(50))
|
||||
dudes += man
|
||||
if(dudes.len == 0)
|
||||
return null
|
||||
return pick(dudes)
|
||||
|
||||
//Announces objectives/generic antag text.
|
||||
/proc/show_generic_antag_text(var/datum/mind/player)
|
||||
if(player.current)
|
||||
@@ -547,28 +494,4 @@ proc/display_roundstart_logout_report()
|
||||
/datum/game_mode/proc/declare_station_goal_completion()
|
||||
for(var/V in station_goals)
|
||||
var/datum/station_goal/G = V
|
||||
G.print_result()
|
||||
|
||||
|
||||
/datum/game_mode/proc/inform_collab(mob/living/carbon/human/M)
|
||||
if(!M)
|
||||
return
|
||||
//Mad-libs for their message
|
||||
var/adjective = pick("strange", "mysterious", "sinister", "un-assuming", "unexpected")
|
||||
var/action_words = pick("aid the fight against Nanotrasen", "repay a debt", "partake in some mischief", "help overthrow the system", "stick it to the man")
|
||||
var/organization = pick("Anti-Fascist Movement", "Syndicate", "Spessmen for the Protesting of Nanotrasen", "Greytider's Union", "Illuminati (in space)")
|
||||
//Stuff to give them a single set of code-words
|
||||
var/list/possible_words = splittext(syndicate_code_phrase, ", ")
|
||||
var/list/possible_reply = splittext(syndicate_code_response, ", ")
|
||||
var/index = rand(1, possible_words.len)
|
||||
var/my_word = possible_words[index]
|
||||
var/my_reply
|
||||
if(possible_reply.len < index) //just in case we had a longer code word list than the response list
|
||||
my_reply = pick(possible_reply)
|
||||
else
|
||||
my_reply = possible_reply[index]
|
||||
|
||||
to_chat(M, "You suddenly remember \an [adjective] note you received earlier informing you that a chance to [action_words] may present itself today. An agent of the [organization] may contact you for help.")
|
||||
to_chat(M, "The note had the words \"[my_word]\" and \"[my_reply]\" written at the bottom, which you memorized just in case.")
|
||||
to_chat(M, "<span class='warning'>Unless stated otherwise; you are NOT an antagonist, so self-antagging rules may still apply to you. Use your good judgement and ahelp if you are unsure of what you are allowed to do.</span>")
|
||||
M.mind.store_memory("<b>Important Words</b>: \"[my_word]\", \"[my_reply]\"")
|
||||
G.print_result()
|
||||
@@ -1,3 +1,5 @@
|
||||
#define NUKESCALINGMODIFIER 1
|
||||
|
||||
/datum/game_mode
|
||||
var/list/datum/mind/syndicates = list()
|
||||
|
||||
@@ -16,7 +18,7 @@ proc/issyndicate(mob/living/M as mob)
|
||||
var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer!
|
||||
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
|
||||
var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level
|
||||
|
||||
var/total_tc = 0 //Total amount of telecrystals shared between nuke ops
|
||||
|
||||
/datum/game_mode/nuclear/announce()
|
||||
to_chat(world, "<B>The current game mode is - Nuclear Emergency!</B>")
|
||||
@@ -97,7 +99,6 @@ proc/issyndicate(mob/living/M as mob)
|
||||
qdel(A)
|
||||
continue
|
||||
|
||||
var/obj/effect/landmark/uplinklocker = locate("landmark*Syndicate-Uplink") //i will be rewriting this shortly
|
||||
var/obj/effect/landmark/nuke_spawn = locate("landmark*Nuclear-Bomb")
|
||||
|
||||
var/nuke_code = "[rand(10000, 99999)]"
|
||||
@@ -131,16 +132,37 @@ proc/issyndicate(mob/living/M as mob)
|
||||
spawnpos++
|
||||
update_synd_icons_added(synd_mind)
|
||||
|
||||
//update_all_synd_icons()
|
||||
|
||||
if(uplinklocker)
|
||||
new /obj/structure/closet/syndicate/nuclear(uplinklocker.loc)
|
||||
scale_telecrystals()
|
||||
share_telecrystals()
|
||||
if(nuke_spawn && synd_spawn.len > 0)
|
||||
var/obj/machinery/nuclearbomb/syndicate/the_bomb = new /obj/machinery/nuclearbomb/syndicate(nuke_spawn.loc)
|
||||
the_bomb.r_code = nuke_code
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/nuclear/proc/scale_telecrystals()
|
||||
var/danger
|
||||
danger = GLOB.player_list.len
|
||||
while(!IsMultiple(++danger, 10)) //Increments danger up to the nearest multiple of ten
|
||||
|
||||
total_tc += danger * NUKESCALINGMODIFIER
|
||||
|
||||
/datum/game_mode/nuclear/proc/share_telecrystals()
|
||||
var/player_tc
|
||||
var/remainder
|
||||
|
||||
player_tc = round(total_tc / GLOB.nuclear_uplink_list.len) //round to get an integer and not floating point
|
||||
remainder = total_tc % GLOB.nuclear_uplink_list.len
|
||||
|
||||
for(var/obj/item/radio/uplink/nuclear/U in GLOB.nuclear_uplink_list)
|
||||
U.hidden_uplink.uses += player_tc
|
||||
while(remainder > 0)
|
||||
for(var/obj/item/radio/uplink/nuclear/U in GLOB.nuclear_uplink_list)
|
||||
if(remainder <= 0)
|
||||
break
|
||||
U.hidden_uplink.uses++
|
||||
remainder--
|
||||
|
||||
/datum/game_mode/proc/create_syndicate(datum/mind/synd_mind) // So we don't have inferior species as ops - randomize a human
|
||||
var/mob/living/carbon/human/M = synd_mind.current
|
||||
|
||||
@@ -245,7 +267,7 @@ proc/issyndicate(mob/living/M as mob)
|
||||
synd_mob.equip_to_slot_or_del(new /obj/item/gun/projectile/automatic/pistol(synd_mob), slot_belt)
|
||||
synd_mob.equip_to_slot_or_del(new /obj/item/storage/box/survival_syndi(synd_mob.back), slot_in_backpack)
|
||||
|
||||
var/obj/item/radio/uplink/U = new /obj/item/radio/uplink(synd_mob)
|
||||
var/obj/item/radio/uplink/nuclear/U = new /obj/item/radio/uplink/nuclear(synd_mob)
|
||||
U.hidden_uplink.uplink_owner="[synd_mob.key]"
|
||||
U.hidden_uplink.uses = 20
|
||||
synd_mob.equip_to_slot_or_del(U, slot_in_backpack)
|
||||
@@ -514,3 +536,5 @@ proc/issyndicate(mob/living/M as mob)
|
||||
dat += "<hr>"
|
||||
|
||||
return dat
|
||||
|
||||
#undef NUKESCALINGMODIFIER
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
Such a brazen move will attract the attention of powerful benefactors within the Syndicate, who will supply your team with a massive amount of bonus telecrystals. \
|
||||
Must be used within five minutes, or your benefactors will lose interest."
|
||||
var/declaring_war = FALSE
|
||||
var/total_tc = 0 //Total amount of telecrystals shared between nuke ops
|
||||
|
||||
/obj/item/nuclear_challenge/attack_self(mob/living/user)
|
||||
if(!check_allowed(user))
|
||||
@@ -50,17 +51,33 @@
|
||||
event_announcement.Announce(war_declaration, "Declaration of War", 'sound/effects/siren.ogg')
|
||||
|
||||
to_chat(user, "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission.")
|
||||
to_chat(user, "<b>Look below you on the floor for the extra uplink</b>")
|
||||
to_chat(user, "<b>Your bonus telecrystals have been split between your team's uplinks.</b>")
|
||||
|
||||
for(var/obj/machinery/computer/shuttle/syndicate/S in GLOB.machines)
|
||||
S.challenge = TRUE
|
||||
|
||||
var/obj/item/radio/uplink/U = new /obj/item/radio/uplink(get_turf(user))
|
||||
U.hidden_uplink.uplink_owner= "[user.key]"
|
||||
U.hidden_uplink.uses = CHALLENGE_TELECRYSTALS + round((((GLOB.player_list.len - CHALLENGE_MIN_PLAYERS)/CHALLENGE_SCALE_PLAYER) * CHALLENGE_SCALE_BONUS)) // No. of player - Min. Player to dec, divided by player per bonus, then multipled by TC per bonus. Rounded.
|
||||
// No. of player - Min. Player to dec, divided by player per bonus, then multipled by TC per bonus. Rounded.
|
||||
total_tc = CHALLENGE_TELECRYSTALS + round((((GLOB.player_list.len - CHALLENGE_MIN_PLAYERS)/CHALLENGE_SCALE_PLAYER) * CHALLENGE_SCALE_BONUS))
|
||||
share_telecrystals()
|
||||
config.shuttle_refuel_delay = CHALLENGE_SHUTTLE_DELAY
|
||||
qdel(src)
|
||||
|
||||
/obj/item/nuclear_challenge/proc/share_telecrystals()
|
||||
var/player_tc
|
||||
var/remainder
|
||||
|
||||
player_tc = round(total_tc / GLOB.nuclear_uplink_list.len) //round to get an integer and not floating point
|
||||
remainder = total_tc % GLOB.nuclear_uplink_list.len
|
||||
|
||||
for(var/obj/item/radio/uplink/nuclear/U in GLOB.nuclear_uplink_list)
|
||||
U.hidden_uplink.uses += player_tc
|
||||
while(remainder > 0)
|
||||
for(var/obj/item/radio/uplink/nuclear/U in GLOB.nuclear_uplink_list)
|
||||
if(remainder <= 0)
|
||||
break
|
||||
U.hidden_uplink.uses++
|
||||
remainder--
|
||||
|
||||
/obj/item/nuclear_challenge/proc/check_allowed(mob/living/user)
|
||||
if(declaring_war)
|
||||
to_chat(user, "You are already in the process of declaring war! Make your mind up.")
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
EPILEPSYBLOCK = getAssignedBlock("EPILEPSY", numsToAssign)
|
||||
TWITCHBLOCK = getAssignedBlock("TWITCH", numsToAssign)
|
||||
NERVOUSBLOCK = getAssignedBlock("NERVOUS", numsToAssign)
|
||||
WINGDINGSBLOCK = getAssignedBlock("WINGDINGS", numsToAssign)
|
||||
|
||||
// Bay muts
|
||||
BREATHLESSBLOCK = getAssignedBlock("BREATHLESS", numsToAssign, DNA_HARD_BOUNDS, good=1)
|
||||
|
||||
@@ -70,10 +70,6 @@
|
||||
modePlayer += traitors
|
||||
..()
|
||||
|
||||
/datum/game_mode/traitor/setup_chumps()
|
||||
//since we actually have potential collaborators, we don't prepare any chumps to avoid extra people knowing our codewords.
|
||||
return
|
||||
|
||||
/datum/game_mode/proc/forge_traitor_objectives(datum/mind/traitor)
|
||||
if(istype(traitor.current, /mob/living/silicon))
|
||||
var/objective_count = 0
|
||||
@@ -347,20 +343,6 @@
|
||||
if(!safety)//If they are not a rev. Can be added on to.
|
||||
give_codewords(traitor_mob)
|
||||
|
||||
// Tell them about people they might want to contact.
|
||||
var/mob/living/carbon/human/M = get_nt_opposed()
|
||||
if(M && M != traitor_mob)
|
||||
to_chat(traitor_mob, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting [M.p_them()].")
|
||||
traitor_mob.mind.store_memory("<b>Potential Collaborator</b>: [M.real_name]")
|
||||
//let's also inform their contact that they might be called upon, but leave it vague.
|
||||
inform_collab(M)
|
||||
|
||||
/datum/game_mode/traitor/inform_collab(mob/living/carbon/human/M)
|
||||
if(M.mind in traitors) //if you are already a traitor, you already know the codewords and your role, so skip this message.
|
||||
return
|
||||
..(M)
|
||||
|
||||
|
||||
/datum/game_mode/proc/remove_traitor(datum/mind/traitor_mind)
|
||||
if(traitor_mind in traitors)
|
||||
ticker.mode.traitors -= traitor_mind
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt.")
|
||||
if("healing")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(null))
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
|
||||
M.equip_to_slot_or_del(new /obj/item/gun/magic/staff/healing(M), slot_r_hand)
|
||||
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [H.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
|
||||
if("robeless")
|
||||
|
||||
@@ -161,11 +161,18 @@
|
||||
|
||||
/datum/spellbook_entry/forcewall
|
||||
name = "Force Wall"
|
||||
spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/forcewall
|
||||
log_name = "FW"
|
||||
category = "Defensive"
|
||||
cost = 1
|
||||
|
||||
/datum/spellbook_entry/greaterforcewall
|
||||
name = "Greater Force Wall"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/forcewall/greater
|
||||
log_name = "GFW"
|
||||
category = "Defensive"
|
||||
cost = 1
|
||||
|
||||
/datum/spellbook_entry/blink
|
||||
name = "Blink"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/turf_teleport/blink
|
||||
@@ -791,7 +798,7 @@
|
||||
stored_swap = null
|
||||
|
||||
/obj/item/spellbook/oneuse/forcewall
|
||||
spell = /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall
|
||||
spell = /obj/effect/proc_holder/spell/targeted/forcewall
|
||||
spellname = "forcewall"
|
||||
icon_state ="bookforcewall"
|
||||
desc = "This book has a dedication to mimes everywhere inside the front cover."
|
||||
|
||||
@@ -34,7 +34,8 @@
|
||||
return
|
||||
|
||||
H.dna.SetSEState(SOBERBLOCK,1)
|
||||
H.mutations += SOBER
|
||||
genemutcheck(H, SOBERBLOCK, null, MUTCHK_FORCED)
|
||||
H.dna.default_blocks.Add(SOBERBLOCK)
|
||||
H.check_mutations = 1
|
||||
|
||||
|
||||
@@ -249,9 +250,8 @@
|
||||
implant.insert(H)
|
||||
|
||||
H.mutations.Add(CLUMSY)
|
||||
H.dna.SetSEState(COMICBLOCK, 1, 1)
|
||||
genemutcheck(H, COMICBLOCK, null, MUTCHK_FORCED)
|
||||
|
||||
if(!ismachine(H))
|
||||
H.mutations.Add(COMIC)
|
||||
|
||||
/datum/job/mime
|
||||
title = "Mime"
|
||||
|
||||
@@ -29,10 +29,9 @@
|
||||
l_ear = /obj/item/radio/headset/syndicate/alt/syndteam
|
||||
pda = /obj/item/pinpointer/advpinpointer
|
||||
id = /obj/item/card/id/syndicate/command
|
||||
box = /obj/item/storage/box/engineer
|
||||
box = /obj/item/storage/box/survival_syndi
|
||||
backpack_contents = list(
|
||||
/obj/item/flashlight = 1,
|
||||
/obj/item/reagent_containers/food/pill/initropidril = 1,
|
||||
/obj/item/reagent_containers/food/snacks/syndidonkpocket = 1,
|
||||
/obj/item/ammo_box/magazine/m50 = 2,
|
||||
/obj/item/clothing/shoes/magboots/syndie/advance = 1,
|
||||
@@ -48,7 +47,7 @@
|
||||
if(visualsOnly)
|
||||
return
|
||||
|
||||
var/obj/item/implant/uplink/U = new /obj/item/implant/uplink(H)
|
||||
var/obj/item/implant/uplink/admin/U = new /obj/item/implant/uplink/admin(H)
|
||||
U.implant(H)
|
||||
U.hidden_uplink.uses = 500
|
||||
H.faction += "syndicate"
|
||||
|
||||
@@ -1,224 +0,0 @@
|
||||
#define NUKESCALINGMODIFIER 1
|
||||
|
||||
var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","Foxtrot","Zero", "Niner")
|
||||
|
||||
|
||||
/obj/machinery/computer/telecrystals
|
||||
name = "telecrystal assignment station"
|
||||
desc = "A device used to manage telecrystals during group operations. You shouldn't be looking at this particular one..."
|
||||
|
||||
/////////////////////////////////////////////
|
||||
/obj/machinery/computer/telecrystals/uplinker
|
||||
name = "telecrystal upload/recieve station"
|
||||
desc = "A device used to manage telecrystals during group operations. To use, simply insert your uplink. With your uplink installed \
|
||||
you can upload your telecrystals to the group's pool using the console, or be assigned additional telecrystals by your lieutenant."
|
||||
icon_state = "tcstation"
|
||||
icon_keyboard = "tcstation_key"
|
||||
icon_screen = "syndie"
|
||||
var/obj/item/uplinkholder = null
|
||||
var/obj/machinery/computer/telecrystals/boss/linkedboss = null
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/New()
|
||||
..()
|
||||
|
||||
var/ID
|
||||
if(possible_uplinker_IDs.len)
|
||||
ID = pick(possible_uplinker_IDs)
|
||||
possible_uplinker_IDs -= ID
|
||||
name = "[name] [ID]"
|
||||
else
|
||||
name = "[name] [rand(1,999)]"
|
||||
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
|
||||
if(istype(O, /obj/item))
|
||||
|
||||
if(uplinkholder)
|
||||
to_chat(user, "<span class='notice'>The [src] already has an uplink in it.</span>")
|
||||
return
|
||||
|
||||
if(O.hidden_uplink)
|
||||
var/obj/item/P = user.get_active_hand()
|
||||
user.drop_item()
|
||||
uplinkholder = P
|
||||
P.loc = src
|
||||
P.add_fingerprint(user)
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The [O] doesn't appear to be an uplink...</span>")
|
||||
|
||||
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/update_icon()
|
||||
overlays.Cut()
|
||||
..()
|
||||
if(uplinkholder)
|
||||
overlays += "[initial(icon_state)]-closed"
|
||||
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/proc/ejectuplink()
|
||||
if(uplinkholder)
|
||||
uplinkholder.loc = get_turf(src.loc)
|
||||
uplinkholder = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/proc/donateTC(var/amt, var/addLog = 1)
|
||||
if(uplinkholder && linkedboss)
|
||||
if(amt <= uplinkholder.hidden_uplink.uses)
|
||||
uplinkholder.hidden_uplink.uses -= amt
|
||||
linkedboss.storedcrystals += amt
|
||||
if(addLog)
|
||||
linkedboss.logTransfer("[src] donated [amt] telecrystals to [linkedboss].")
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/proc/giveTC(var/amt, var/addLog = 1)
|
||||
if(uplinkholder && linkedboss)
|
||||
if(amt <= linkedboss.storedcrystals)
|
||||
uplinkholder.hidden_uplink.uses += amt
|
||||
linkedboss.storedcrystals -= amt
|
||||
if(addLog)
|
||||
linkedboss.logTransfer("[src] recieved [amt] telecrystals from [linkedboss].")
|
||||
|
||||
///////
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/attack_hand(mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
src.add_fingerprint(user)
|
||||
user.set_machine(src)
|
||||
|
||||
var/dat = ""
|
||||
if(linkedboss)
|
||||
dat += "[linkedboss] has [linkedboss.storedcrystals] telecrystals available for distribution. <BR><BR>"
|
||||
else
|
||||
dat += "No linked management consoles detected. Scan for uplink stations using the management console.<BR><BR>"
|
||||
|
||||
if(uplinkholder)
|
||||
dat += "[uplinkholder.hidden_uplink.uses] telecrystals remain in this uplink.<BR>"
|
||||
if(linkedboss)
|
||||
dat += "Donate TC: <a href='byond://?src=[UID()];donate1=1'>1</a> | <a href='byond://?src=[UID()];donate5=1'>5</a>"
|
||||
dat += "<br><a href='byond://?src=[UID()];eject=1'>Eject Uplink</a>"
|
||||
|
||||
|
||||
var/datum/browser/popup = new(user, "computer", "Telecrystal Upload/Recieve Station", 700, 500)
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if(href_list["donate1"])
|
||||
donateTC(1)
|
||||
|
||||
if(href_list["donate5"])
|
||||
donateTC(5)
|
||||
|
||||
if(href_list["eject"])
|
||||
ejectuplink()
|
||||
|
||||
src.updateUsrDialog()
|
||||
|
||||
|
||||
/////////////////////////////////////////
|
||||
/obj/machinery/computer/telecrystals/boss
|
||||
name = "team Telecrystal management console"
|
||||
desc = "A device used to manage telecrystals during group operations. To use, simply initialize the machine by scanning for nearby uplink stations. \
|
||||
Once the consoles are linked up, you can assign any telecrystals amongst your operatives; be they donated by your agents or rationed to the squad \
|
||||
based on the danger rating of the mission."
|
||||
icon_keyboard = "syndie_key"
|
||||
icon_screen = "tcboss"
|
||||
var/virgin = 1
|
||||
var/scanrange = 10
|
||||
var/storedcrystals = 0
|
||||
var/list/TCstations = list()
|
||||
var/list/transferlog = list()
|
||||
|
||||
/obj/machinery/computer/telecrystals/boss/proc/logTransfer(var/logmessage)
|
||||
transferlog += ("<b>[station_time_timestamp()]</b> [logmessage]")
|
||||
|
||||
/obj/machinery/computer/telecrystals/boss/proc/scanUplinkers()
|
||||
for(var/obj/machinery/computer/telecrystals/uplinker/A in range(scanrange, src.loc))
|
||||
if(!A.linkedboss)
|
||||
TCstations += A
|
||||
A.linkedboss = src
|
||||
if(virgin)
|
||||
getDangerous()
|
||||
virgin = 0
|
||||
|
||||
/obj/machinery/computer/telecrystals/boss/proc/getDangerous()//This scales the TC assigned with the round population.
|
||||
..()
|
||||
var/danger
|
||||
danger = GLOB.player_list.len
|
||||
while(!IsMultiple(++danger,10))//Just round up to the nearest multiple of ten.
|
||||
scaleTC(danger)
|
||||
|
||||
/obj/machinery/computer/telecrystals/boss/proc/scaleTC(var/amt)//Its own proc, since it'll probably need a lot of tweaks for balance, use a fancier algorhithm, etc.
|
||||
storedcrystals += amt * NUKESCALINGMODIFIER
|
||||
|
||||
/////////
|
||||
|
||||
/obj/machinery/computer/telecrystals/boss/attack_hand(var/mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
src.add_fingerprint(user)
|
||||
user.set_machine(src)
|
||||
|
||||
|
||||
var/dat = ""
|
||||
dat += "<a href='byond://?src=[UID()];scan=1'>Scan for TC stations.</a><BR>"
|
||||
dat += "This [src] has [storedcrystals] telecrystals available for distribution. <BR>"
|
||||
dat += "<BR><BR>"
|
||||
|
||||
|
||||
for(var/obj/machinery/computer/telecrystals/uplinker/A in TCstations)
|
||||
dat += "[A.name] | "
|
||||
if(A.uplinkholder)
|
||||
dat += "[A.uplinkholder.hidden_uplink.uses] telecrystals."
|
||||
if(storedcrystals)
|
||||
dat+= "<BR>Add TC: <a href ='?src=[UID()];give1=\ref[A]'>1</a> | <a href ='?src=[UID()];give5=\ref[A]'>5</a>"
|
||||
dat += "<BR>"
|
||||
|
||||
if(TCstations.len)
|
||||
dat += "<BR><BR><a href='byond://?src=[UID()];distrib=1'>Evenly distribute remaining TC.</a><BR><BR>"
|
||||
|
||||
|
||||
for(var/entry in transferlog)
|
||||
dat += "<small>[entry]</small><BR>"
|
||||
|
||||
|
||||
var/datum/browser/popup = new(user, "computer", "Team Telecrystal Management Console", 700, 500)
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/telecrystals/boss/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
if(href_list["scan"])
|
||||
scanUplinkers()
|
||||
|
||||
if(href_list["give1"])
|
||||
var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give1"])
|
||||
A.giveTC(1)
|
||||
|
||||
if(href_list["give5"])
|
||||
var/obj/machinery/computer/telecrystals/uplinker/A = locate(href_list["give5"])
|
||||
A.giveTC(5)
|
||||
|
||||
if(href_list["distrib"])
|
||||
var/sanity = 0
|
||||
while(storedcrystals && sanity < 100)
|
||||
for(var/obj/machinery/computer/telecrystals/uplinker/A in TCstations)
|
||||
A.giveTC(1,0)
|
||||
sanity++
|
||||
logTransfer("[src] evenly distributed telecrystals.")
|
||||
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
#undef NUKESCALINGMODIFIER
|
||||
@@ -21,6 +21,10 @@
|
||||
var/locked = FALSE
|
||||
var/safeties = TRUE
|
||||
var/broken = FALSE
|
||||
var/secure = FALSE //set to true to enable ID locking
|
||||
var/shocked = FALSE//is it shocking anyone that touches it?
|
||||
req_access = list(access_eva) //the ID needed if ID lock is enabled
|
||||
var/datum/wires/suitstorage/wires
|
||||
|
||||
var/uv = FALSE
|
||||
var/uv_super = FALSE
|
||||
@@ -39,50 +43,90 @@
|
||||
helmet_type = /obj/item/clothing/head/helmet/space/eva
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
|
||||
/obj/machinery/suit_storage_unit/standard_unit/secure
|
||||
secure = TRUE //start with ID lock enabled
|
||||
|
||||
/obj/machinery/suit_storage_unit/captain
|
||||
suit_type = /obj/item/clothing/suit/space/captain
|
||||
helmet_type = /obj/item/clothing/head/helmet/space/capspace
|
||||
mask_type = /obj/item/clothing/mask/gas
|
||||
storage_type = /obj/item/tank/jetpack/oxygen/captain
|
||||
req_access = list(access_captain)
|
||||
|
||||
/obj/machinery/suit_storage_unit/captain/secure
|
||||
secure = TRUE
|
||||
|
||||
/obj/machinery/suit_storage_unit/engine
|
||||
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
|
||||
req_access = list(access_engine_equip)
|
||||
|
||||
/obj/machinery/suit_storage_unit/engine/secure
|
||||
secure = TRUE
|
||||
|
||||
/obj/machinery/suit_storage_unit/ce
|
||||
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
|
||||
req_access = list(access_ce)
|
||||
|
||||
/obj/machinery/suit_storage_unit/ce/secure
|
||||
secure = TRUE
|
||||
|
||||
/obj/machinery/suit_storage_unit/security
|
||||
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
|
||||
req_access = list(access_security)
|
||||
|
||||
/obj/machinery/suit_storage_unit/security/secure
|
||||
secure = TRUE
|
||||
|
||||
/obj/machinery/suit_storage_unit/atmos
|
||||
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
|
||||
req_access = list(access_atmospherics)
|
||||
|
||||
/obj/machinery/suit_storage_unit/atmos/secure
|
||||
secure = TRUE
|
||||
|
||||
/obj/machinery/suit_storage_unit/mining
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/mining
|
||||
helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/mining
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
req_access = list(access_mining_station)
|
||||
|
||||
/obj/machinery/suit_storage_unit/mining/secure
|
||||
secure = TRUE
|
||||
|
||||
/obj/machinery/suit_storage_unit/cmo
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/medical
|
||||
helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/medical
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
req_access = list(access_cmo)
|
||||
|
||||
/obj/machinery/suit_storage_unit/cmo/secure
|
||||
secure = TRUE
|
||||
|
||||
/obj/machinery/suit_storage_unit/syndicate
|
||||
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
|
||||
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
|
||||
|
||||
/obj/machinery/suit_storage_unit/ert
|
||||
req_access = list(access_cent_general)
|
||||
|
||||
/obj/machinery/suit_storage_unit/ert/command
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/ert/commander
|
||||
@@ -90,25 +134,39 @@
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
storage_type = /obj/item/tank/emergency_oxygen/double
|
||||
|
||||
/obj/machinery/suit_storage_unit/ert/command/secure
|
||||
secure = TRUE
|
||||
|
||||
/obj/machinery/suit_storage_unit/ert/security
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/ert/security
|
||||
helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/ert/security
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
storage_type = /obj/item/tank/emergency_oxygen/double
|
||||
|
||||
/obj/machinery/suit_storage_unit/ert/security/secure
|
||||
secure = TRUE
|
||||
|
||||
/obj/machinery/suit_storage_unit/ert/engineer
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/ert/engineer
|
||||
helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
storage_type = /obj/item/tank/emergency_oxygen/double
|
||||
|
||||
/obj/machinery/suit_storage_unit/ert/engineer/secure
|
||||
secure = TRUE
|
||||
|
||||
/obj/machinery/suit_storage_unit/ert/medical
|
||||
suit_type = /obj/item/clothing/suit/space/hardsuit/ert/medical
|
||||
helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/ert/medical
|
||||
mask_type = /obj/item/clothing/mask/breath
|
||||
storage_type = /obj/item/tank/emergency_oxygen/double
|
||||
|
||||
/obj/machinery/suit_storage_unit/ert/medical/secure
|
||||
secure = TRUE
|
||||
|
||||
/obj/machinery/suit_storage_unit/New()
|
||||
..()
|
||||
wires = new(src)
|
||||
|
||||
/obj/machinery/suit_storage_unit/Initialize()
|
||||
. = ..()
|
||||
@@ -131,6 +189,7 @@
|
||||
QDEL_NULL(helmet)
|
||||
QDEL_NULL(mask)
|
||||
QDEL_NULL(storage)
|
||||
QDEL_NULL(wires)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/suit_storage_unit/update_icon()
|
||||
@@ -158,6 +217,9 @@
|
||||
add_overlay("human")
|
||||
|
||||
/obj/machinery/suit_storage_unit/attackby(obj/item/I as obj, mob/user as mob, params)
|
||||
if(shocked)
|
||||
if(shock(user, 100))
|
||||
return
|
||||
if(!is_operational())
|
||||
if(panel_open)
|
||||
to_chat(usr, "<span class='warning'>Close the maintenance panel first.</span>")
|
||||
@@ -170,6 +232,9 @@
|
||||
to_chat(user, text("<span class='notice'>You [panel_open ? "open up" : "close"] the unit's maintenance panel.</span>"))
|
||||
updateUsrDialog()
|
||||
return
|
||||
if(panel_open)
|
||||
wires.Interact(user)
|
||||
|
||||
if(state_open)
|
||||
if(store_item(I, user))
|
||||
update_icon()
|
||||
@@ -289,11 +354,11 @@
|
||||
dump_contents()
|
||||
|
||||
/obj/machinery/suit_storage_unit/shock(mob/user, prb)
|
||||
if(!prob(prb))
|
||||
if(prob(prb)) //why was this inverted before?!?
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
if(electrocute_mob(user, src, src, 1, TRUE))
|
||||
if(electrocute_mob(user, get_area(src), src, 1))
|
||||
return 1
|
||||
|
||||
/obj/machinery/suit_storage_unit/relaymove(mob/user)
|
||||
@@ -383,6 +448,9 @@
|
||||
|
||||
/obj/machinery/suit_storage_unit/attack_hand(mob/user as mob)
|
||||
var/dat
|
||||
if(shocked)
|
||||
if(shock(usr, 100))
|
||||
return
|
||||
if(..())
|
||||
return
|
||||
if(stat & NOPOWER)
|
||||
@@ -390,13 +458,8 @@
|
||||
if(!user.IsAdvancedToolUser())
|
||||
return FALSE
|
||||
if(panel_open) //The maintenance panel is open. Time for some shady stuff
|
||||
dat+= "<HEAD><TITLE>Suit storage unit: Maintenance panel</TITLE></HEAD>"
|
||||
dat+= "<B>Maintenance panel controls</B><HR>"
|
||||
dat+= "<font color ='grey'>The panel is ridden with controls, button and meters, labeled in strange signs and symbols that <BR>you cannot understand. Probably the manufactoring world's language.<BR> Among other things, a few controls catch your eye.<BR><BR>"
|
||||
dat+= text("A small dial with an arrow embroidered on it. It's pointing towards a gauge that reads [].<BR> <font color='blue'><A href='?src=[UID()];toggleUV=1'> Turn towards []</A><BR>",(uv_super ? "15nm" : "185nm"),(uv_super ? "185nm" : "15nm") )
|
||||
dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on.<BR><font color ='blue'><A href='?src=[UID()];togglesafeties=1'>Press button</a></font>",(safeties ? "<font color='green'><B>GREEN</B></font>" : "<font color='red'><B>RED</B></font>"))
|
||||
dat+= "<HR><BR><A href='?src=[user.UID()];mach_close=suit_storage_unit'>Close panel</A>"
|
||||
else if(uv) //The thing is running its cauterisation cycle. You have to wait.
|
||||
wires.Interact(user)
|
||||
if(uv) //The thing is running its cauterisation cycle. You have to wait.
|
||||
dat += "<HEAD><TITLE>Suit storage unit</TITLE></HEAD>"
|
||||
dat+= "<font color ='red'><B>Unit is cauterising contents with selected UV ray intensity. Please wait.</font></B><BR>"
|
||||
|
||||
@@ -438,10 +501,18 @@
|
||||
onclose(user, "suit_storage_unit")
|
||||
return
|
||||
|
||||
/obj/machinery/suit_storage_unit/proc/check_allowed(user)
|
||||
if(!(allowed(user) || !secure))
|
||||
to_chat(user, "<span class='warning'>Access denied.</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/suit_storage_unit/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
if(shocked)
|
||||
if(shock(usr, 100))
|
||||
return
|
||||
if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
|
||||
usr.set_machine(src)
|
||||
if(href_list["toggleUV"])
|
||||
@@ -469,10 +540,14 @@
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
if(href_list["toggle_open"])
|
||||
if(!check_allowed(usr))
|
||||
return
|
||||
toggle_open(usr)
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
if(href_list["toggle_lock"])
|
||||
if(!check_allowed(usr))
|
||||
return
|
||||
toggle_lock(usr)
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
wreckage = /obj/effect/decal/mecha_wreckage/gygax/dark
|
||||
max_equip = 4
|
||||
maxsize = 2
|
||||
starting_voice = /obj/item/mecha_modkit/voice/syndicate
|
||||
|
||||
/obj/mecha/combat/gygax/dark/loaded/New()
|
||||
..()
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
wreckage = /obj/effect/decal/mecha_wreckage/honker
|
||||
add_req_access = 0
|
||||
max_equip = 3
|
||||
starting_voice = /obj/item/mecha_modkit/voice/honk
|
||||
var/squeak = 0
|
||||
|
||||
/obj/mecha/combat/honker/loaded/New()
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
internal_damage_threshold = 25
|
||||
force = 45
|
||||
max_equip = 5
|
||||
starting_voice = /obj/item/mecha_modkit/voice/nanotrasen
|
||||
|
||||
/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0)
|
||||
. = ..()
|
||||
@@ -89,6 +90,7 @@
|
||||
initial_icon = "mauler"
|
||||
operation_req_access = list(access_syndicate)
|
||||
wreckage = /obj/effect/decal/mecha_wreckage/mauler
|
||||
starting_voice = /obj/item/mecha_modkit/voice/syndicate
|
||||
|
||||
/obj/mecha/combat/marauder/mauler/loaded/New()
|
||||
..()
|
||||
|
||||
@@ -15,10 +15,11 @@
|
||||
add_req_access = 0
|
||||
internal_damage_threshold = 60
|
||||
max_equip = 3
|
||||
step_energy_drain = 3
|
||||
step_energy_drain = 3
|
||||
normal_step_energy_drain = 3
|
||||
stepsound = null
|
||||
turnsound = null
|
||||
starting_voice = /obj/item/mecha_modkit/voice/silent
|
||||
|
||||
/obj/mecha/combat/reticence/loaded/New()
|
||||
..()
|
||||
|
||||
@@ -34,9 +34,9 @@
|
||||
chassis.occupant_message("<span class='danger'>The [src] is destroyed!</span>")
|
||||
chassis.log_append_to_last("[src] is destroyed.",1)
|
||||
if(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon))
|
||||
chassis.occupant << sound('sound/mecha/weapdestr.ogg', volume = 50)
|
||||
chassis.occupant << sound(chassis.weapdestrsound, volume = 50)
|
||||
else
|
||||
chassis.occupant << sound('sound/mecha/critdestr.ogg', volume = 50)
|
||||
chassis.occupant << sound(chassis.critdestrsound, volume = 50)
|
||||
detach(chassis)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -76,6 +76,15 @@
|
||||
|
||||
var/stepsound = 'sound/mecha/mechstep.ogg'
|
||||
var/turnsound = 'sound/mecha/mechturn.ogg'
|
||||
var/nominalsound = 'sound/mecha/nominal.ogg'
|
||||
var/zoomsound = 'sound/mecha/imag_enh.ogg'
|
||||
var/critdestrsound = 'sound/mecha/critdestr.ogg'
|
||||
var/weapdestrsound = 'sound/mecha/weapdestr.ogg'
|
||||
var/lowpowersound = 'sound/mecha/lowpower.ogg'
|
||||
var/longactivationsound = 'sound/mecha/nominal.ogg'
|
||||
var/starting_voice = /obj/item/mecha_modkit/voice
|
||||
var/activated = FALSE
|
||||
var/power_warned = FALSE
|
||||
|
||||
var/melee_cooldown = 10
|
||||
var/melee_can_hit = 1
|
||||
@@ -121,6 +130,10 @@
|
||||
diag_hud_set_mechstat()
|
||||
diag_hud_set_mechtracking()
|
||||
|
||||
var/obj/item/mecha_modkit/voice/V = new starting_voice(src)
|
||||
V.install(src)
|
||||
qdel(V)
|
||||
|
||||
////////////////////////
|
||||
////// Helpers /////////
|
||||
////////////////////////
|
||||
@@ -872,6 +885,16 @@
|
||||
user.drop_item()
|
||||
qdel(P)
|
||||
|
||||
else if(istype(W, /obj/item/mecha_modkit))
|
||||
if(occupant)
|
||||
to_chat(user, "<span class='notice'>You can't access the mech's modification port while it is occupied.</span>")
|
||||
return
|
||||
var/obj/item/mecha_modkit/M = W
|
||||
if(do_after_once(user, M.install_time, target = src))
|
||||
M.install(src, user)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You stop installing [M].</span>")
|
||||
|
||||
else
|
||||
return attacked_by(W, user)
|
||||
|
||||
@@ -993,7 +1016,7 @@
|
||||
icon_state = initial(icon_state)
|
||||
playsound(src, 'sound/machines/windowdoor.ogg', 50, 1)
|
||||
if(!hasInternalDamage())
|
||||
occupant << sound('sound/mecha/nominal.ogg',volume=50)
|
||||
occupant << sound(nominalsound, volume = 50)
|
||||
AI.cancel_camera()
|
||||
AI.controlled_mech = src
|
||||
AI.remote_control = src
|
||||
@@ -1151,8 +1174,13 @@
|
||||
icon_state = reset_icon()
|
||||
dir = dir_in
|
||||
playsound(src, 'sound/machines/windowdoor.ogg', 50, 1)
|
||||
if(!hasInternalDamage())
|
||||
occupant << sound('sound/mecha/nominal.ogg', volume = 50)
|
||||
if(!activated)
|
||||
occupant << sound(longactivationsound, volume = 50)
|
||||
activated = TRUE
|
||||
else if(!hasInternalDamage())
|
||||
occupant << sound(nominalsound, volume = 50)
|
||||
if(state)
|
||||
H.throw_alert("locked", /obj/screen/alert/mech_maintenance)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
@@ -1208,7 +1236,7 @@
|
||||
dir = dir_in
|
||||
log_message("[mmi_as_oc] moved in as pilot.")
|
||||
if(!hasInternalDamage())
|
||||
to_chat(occupant, sound('sound/mecha/nominal.ogg',volume=50))
|
||||
to_chat(occupant, sound(nominalsound, volume=50))
|
||||
GrantActions(brainmob)
|
||||
return 1
|
||||
else
|
||||
@@ -1235,6 +1263,7 @@
|
||||
return
|
||||
var/atom/movable/mob_container
|
||||
occupant.clear_alert("charge")
|
||||
occupant.clear_alert("locked")
|
||||
occupant.clear_alert("mech damage")
|
||||
occupant.clear_alert("mechaport")
|
||||
occupant.clear_alert("mechaport_d")
|
||||
@@ -1349,15 +1378,41 @@
|
||||
/obj/mecha/proc/use_power(amount)
|
||||
if(get_charge())
|
||||
cell.use(amount)
|
||||
if(occupant)
|
||||
update_cell()
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/mecha/proc/give_power(amount)
|
||||
if(!isnull(get_charge()))
|
||||
cell.give(amount)
|
||||
if(occupant)
|
||||
update_cell()
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/mecha/proc/update_cell()
|
||||
if(cell)
|
||||
var/cellcharge = cell.charge/cell.maxcharge
|
||||
switch(cellcharge)
|
||||
if(0.75 to INFINITY)
|
||||
occupant.clear_alert("charge")
|
||||
if(0.5 to 0.75)
|
||||
occupant.throw_alert("charge", /obj/screen/alert/mech_lowcell, 1)
|
||||
if(0.25 to 0.5)
|
||||
occupant.throw_alert("charge", /obj/screen/alert/mech_lowcell, 2)
|
||||
if(power_warned)
|
||||
power_warned = FALSE
|
||||
if(0.01 to 0.25)
|
||||
occupant.throw_alert("charge", /obj/screen/alert/mech_lowcell, 3)
|
||||
if(!power_warned)
|
||||
occupant << sound(lowpowersound, volume = 50)
|
||||
power_warned = TRUE
|
||||
else
|
||||
occupant.throw_alert("charge", /obj/screen/alert/mech_emptycell)
|
||||
else
|
||||
occupant.throw_alert("charge", /obj/screen/alert/mech_nocell)
|
||||
|
||||
/obj/mecha/proc/reset_icon()
|
||||
if(initial_icon)
|
||||
icon_state = initial_icon
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
chassis.occupant_message("<font color='[chassis.zoom_mode ? "blue" : "red"]'>Zoom mode [chassis.zoom_mode ? "en" : "dis"]abled.</font>")
|
||||
if(chassis.zoom_mode)
|
||||
owner.client.AddViewMod("mecha", 12)
|
||||
SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50))
|
||||
SEND_SOUND(owner, sound(chassis.zoomsound, volume = 50))
|
||||
else
|
||||
owner.client.RemoveViewMod("mecha")
|
||||
UpdateButtonIcon()
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
/obj/item/mecha_modkit
|
||||
name = "mecha modification kit"
|
||||
desc = "A kit to modify your mech. This one doesn't do anything."
|
||||
icon = 'icons/obj/module.dmi'
|
||||
icon_state = "harddisk_mini"
|
||||
var/install_time = 15
|
||||
|
||||
/obj/item/mecha_modkit/proc/install(var/obj/mecha/mech, var/mob/user)
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>You install [src] into [mech].</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/mecha_modkit/voice
|
||||
name = "mecha voice modification kit : Standard"
|
||||
desc = "This modification kit updates a mech's onboard voice to Standard."
|
||||
var/nominalsound = 'sound/mecha/nominal.ogg'
|
||||
var/zoomsound = 'sound/mecha/imag_enh.ogg'
|
||||
var/critdestrsound = 'sound/mecha/critdestr.ogg'
|
||||
var/weapdestrsound = 'sound/mecha/weapdestr.ogg'
|
||||
var/lowpowersound = 'sound/mecha/lowpower.ogg'
|
||||
var/longactivationsound = 'sound/mecha/nominal.ogg'
|
||||
|
||||
/obj/item/mecha_modkit/voice/install(var/obj/mecha/mech, var/mob/living/carbon/user)
|
||||
if(istype(mech, /obj/mecha/combat/reticence) && user)
|
||||
to_chat(user, "<span class='warning'>You attempt to install [src] into [mech], but an invisible barrier prevents you from doing so!</span>")
|
||||
return FALSE
|
||||
if(istype(mech, /obj/mecha/combat/honker) && user)
|
||||
to_chat(user, "<span class='warning'>You attempt to install [src] into [mech], but you somehow trip before you get it in!</span>")
|
||||
user.slip("your own foot", 8, 5, 0, 0, 1, "trip")
|
||||
return FALSE
|
||||
mech.nominalsound = nominalsound
|
||||
mech.zoomsound = zoomsound
|
||||
mech.critdestrsound = critdestrsound
|
||||
mech.weapdestrsound = weapdestrsound
|
||||
mech.lowpowersound = lowpowersound
|
||||
mech.longactivationsound = longactivationsound
|
||||
..()
|
||||
|
||||
/obj/item/mecha_modkit/voice/nanotrasen
|
||||
name = "mecha voice modification kit : Nanotrasen"
|
||||
desc = "This modification kit updates a mech's onboard voice to Nanotrasen."
|
||||
nominalsound = 'sound/mecha/nominalnano.ogg'
|
||||
zoomsound = 'sound/mecha/imag_enhnano.ogg'
|
||||
critdestrsound = 'sound/mecha/critdestrnano.ogg'
|
||||
weapdestrsound = 'sound/mecha/weapdestrnano.ogg'
|
||||
lowpowersound = 'sound/mecha/lowpowernano.ogg'
|
||||
longactivationsound = 'sound/mecha/LongNanoActivation.ogg'
|
||||
|
||||
/obj/item/mecha_modkit/voice/syndicate
|
||||
name = "mecha voice modification kit : Syndicate"
|
||||
desc = "This suspicious modification kit updates a mech's onboard voice to Syndicate."
|
||||
origin_tech = "syndicate=1"
|
||||
nominalsound = 'sound/mecha/nominalsyndi.ogg'
|
||||
zoomsound = 'sound/mecha/imag_enhsyndi.ogg'
|
||||
critdestrsound = 'sound/mecha/critdestrsyndi.ogg'
|
||||
weapdestrsound = 'sound/mecha/weapdestrsyndi.ogg'
|
||||
lowpowersound = 'sound/mecha/lowpowersyndi.ogg'
|
||||
longactivationsound = 'sound/mecha/LongSyndiActivation.ogg'
|
||||
|
||||
/obj/item/mecha_modkit/voice/honk
|
||||
name = "mecha voice modification kit : Honk"
|
||||
desc = "This modification kit updates a mech's onboard voice to Honk. Why?"
|
||||
nominalsound = 'sound/items/bikehorn.ogg'
|
||||
zoomsound = 'sound/items/bikehorn.ogg'
|
||||
critdestrsound = 'sound/items/Airhorn2.ogg'
|
||||
weapdestrsound = 'sound/items/Airhorn2.ogg'
|
||||
lowpowersound = 'sound/items/Airhorn2.ogg'
|
||||
longactivationsound = 'sound/items/bikehorn.ogg'
|
||||
|
||||
/obj/item/mecha_modkit/voice/silent
|
||||
name = "mecha voice modification kit : Silent"
|
||||
desc = "This modification kit silences a mech's onboard voice."
|
||||
nominalsound = null
|
||||
zoomsound = null
|
||||
critdestrsound = null
|
||||
weapdestrsound = null
|
||||
lowpowersound = null
|
||||
longactivationsound = null
|
||||
@@ -195,7 +195,7 @@
|
||||
</head>
|
||||
<body>
|
||||
[add_req_access?"<a href='?src=[UID()];req_access=1;id_card=\ref[id_card];user=\ref[user]'>Edit operation keycodes</a>":null]
|
||||
[maint_access?"<a href='?src=[UID()];maint_access=1;id_card=\ref[id_card];user=\ref[user]'>Initiate maintenance protocol</a>":null]
|
||||
[maint_access?"<a href='?src=[UID()];maint_access=1;id_card=\ref[id_card];user=\ref[user]'>Initiate/Stop maintenance protocol</a>":null]
|
||||
[(state>0) ?"<a href='?src=[UID()];set_internal_tank_valve=1;user=\ref[user]'>Set Cabin Air Pressure</a>":null]
|
||||
</body>
|
||||
</html>"}
|
||||
@@ -317,9 +317,13 @@
|
||||
if(state==0)
|
||||
state = 1
|
||||
to_chat(user, "The securing bolts are now exposed.")
|
||||
if(occupant)
|
||||
occupant.throw_alert("locked", /obj/screen/alert/mech_maintenance)
|
||||
else if(state==1)
|
||||
state = 0
|
||||
to_chat(user, "The securing bolts are now hidden.")
|
||||
if(occupant)
|
||||
occupant.clear_alert("locked")
|
||||
output_maintenance_dialog(afilter.getObj("id_card"),user)
|
||||
return
|
||||
if(href_list["set_internal_tank_valve"] && state >=1)
|
||||
|
||||
@@ -7,6 +7,12 @@
|
||||
opacity = 0
|
||||
density = 1
|
||||
unacidable = 1
|
||||
var/lifetime = 30 SECONDS
|
||||
|
||||
/obj/effect/forcefield/New()
|
||||
..()
|
||||
if(lifetime)
|
||||
QDEL_IN(src, lifetime)
|
||||
|
||||
/obj/effect/forcefield/CanAtmosPass(turf/T)
|
||||
return !density
|
||||
@@ -29,12 +35,6 @@
|
||||
icon_state = "empty"
|
||||
name = "invisible wall"
|
||||
desc = "You have a bad feeling about this."
|
||||
var/lifetime = 30 SECONDS
|
||||
|
||||
/obj/effect/forcefield/mime/New()
|
||||
..()
|
||||
if(lifetime)
|
||||
QDEL_IN(src, lifetime)
|
||||
|
||||
/obj/effect/forcefield/mime/advanced
|
||||
name = "invisible blockade"
|
||||
|
||||
@@ -98,6 +98,7 @@
|
||||
/obj/item/poster/random_contraband = 10,
|
||||
/obj/item/crowbar = 10,
|
||||
/obj/item/crowbar/red = 10,
|
||||
/obj/item/restraints/handcuffs/toy = 5,
|
||||
/obj/item/extinguisher = 90,
|
||||
//obj/item/gun/projectile/revolver/russian = 1, //disabled until lootdrop is a proper world proc.
|
||||
/obj/item/hand_labeler = 10,
|
||||
@@ -152,7 +153,8 @@
|
||||
/obj/item/toy/cards/deck/syndicate = 2,
|
||||
/obj/item/storage/secure/briefcase/syndie = 2,
|
||||
/obj/item/storage/fancy/cigarettes/cigpack_syndicate = 2,
|
||||
"" = 70
|
||||
/obj/item/storage/pill_bottle/fakedeath = 2,
|
||||
"" = 68
|
||||
)
|
||||
|
||||
/obj/effect/spawner/lootdrop/crate_spawner // for ruins
|
||||
|
||||
@@ -25,6 +25,7 @@ var/list/world_uplinks = list()
|
||||
var/job = null
|
||||
var/show_descriptions = 0
|
||||
var/temp_category
|
||||
var/uplink_type = "traitor"
|
||||
|
||||
/obj/item/uplink/nano_host()
|
||||
return loc
|
||||
@@ -327,6 +328,21 @@ var/list/world_uplinks = list()
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.trigger(user)
|
||||
|
||||
/obj/item/radio/uplink/nuclear/New()
|
||||
..()
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.uplink_type = "nuclear"
|
||||
GLOB.nuclear_uplink_list += src
|
||||
|
||||
/obj/item/radio/uplink/nuclear/Destroy()
|
||||
GLOB.nuclear_uplink_list -= src
|
||||
return ..()
|
||||
|
||||
/obj/item/radio/uplink/sst/New()
|
||||
..()
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.uplink_type = "sst"
|
||||
|
||||
/obj/item/multitool/uplink/New()
|
||||
hidden_uplink = new(src)
|
||||
|
||||
@@ -340,4 +356,4 @@ var/list/world_uplinks = list()
|
||||
/obj/item/radio/headset/uplink/New()
|
||||
..()
|
||||
hidden_uplink = new(src)
|
||||
hidden_uplink.uses = 20
|
||||
hidden_uplink.uses = 20
|
||||
@@ -58,6 +58,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
|
||||
new /datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1),
|
||||
new /datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new /datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 25, one_per_turf = 1, on_floor = 1),
|
||||
new /datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 25, one_per_turf = 1, on_floor = 1),
|
||||
null,
|
||||
new /datum/stack_recipe_list("airlock assemblies", list(
|
||||
new /datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1),
|
||||
|
||||
@@ -38,4 +38,7 @@
|
||||
amount = 5
|
||||
|
||||
/obj/item/stack/telecrystal/twenty
|
||||
amount = 20
|
||||
amount = 20
|
||||
|
||||
/obj/item/stack/telecrystal/fifty
|
||||
amount = 50
|
||||
|
||||
@@ -1650,3 +1650,13 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
icon_state = "conch"
|
||||
use_action = "pulls the string"
|
||||
possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.")
|
||||
|
||||
/*
|
||||
*Fake cuffs (honk honk)
|
||||
*/
|
||||
|
||||
/obj/item/restraints/handcuffs/toy
|
||||
desc = "Toy handcuffs. Plastic and extremely cheaply made."
|
||||
throwforce = 0
|
||||
breakouttime = 0
|
||||
ignoresClumsy = TRUE
|
||||
@@ -15,6 +15,7 @@
|
||||
breakouttime = 600 //Deciseconds = 60s = 1 minutes
|
||||
var/cuffsound = 'sound/weapons/handcuffs.ogg'
|
||||
var/trashtype = null //For disposable cuffs
|
||||
var/ignoresClumsy = FALSE
|
||||
|
||||
/obj/item/restraints/handcuffs/attack(mob/living/carbon/C, mob/user)
|
||||
if(!user.IsAdvancedToolUser())
|
||||
@@ -23,7 +24,7 @@
|
||||
if(!istype(C))
|
||||
return
|
||||
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
if((CLUMSY in user.mutations) && prob(50) && (!ignoresClumsy))
|
||||
to_chat(user, "<span class='warning'>Uh... how do those things work?!</span>")
|
||||
apply_cuffs(user,user)
|
||||
|
||||
|
||||
@@ -10,6 +10,16 @@
|
||||
hidden_uplink.uses = 10
|
||||
..()
|
||||
|
||||
/obj/item/implant/uplink/sit/New()
|
||||
..()
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.uplink_type = "sit"
|
||||
|
||||
/obj/item/implant/uplink/admin/New()
|
||||
..()
|
||||
if(hidden_uplink)
|
||||
hidden_uplink.uplink_type = "admin"
|
||||
|
||||
/obj/item/implant/uplink/implant(mob/source)
|
||||
var/obj/item/implant/imp_e = locate(src.type) in source
|
||||
if(imp_e && imp_e != src)
|
||||
|
||||
@@ -98,6 +98,7 @@
|
||||
new /obj/item/clothing/mask/gas/voice/clown(src)
|
||||
new /obj/item/radio/headset/headset_service(src)
|
||||
new /obj/item/pda/clown(src)
|
||||
new /obj/item/storage/box/survival(src)
|
||||
new /obj/item/reagent_containers/food/snacks/grown/banana(src)
|
||||
new /obj/item/stamp/clown(src)
|
||||
new /obj/item/toy/crayon/rainbow(src)
|
||||
|
||||
@@ -330,3 +330,9 @@
|
||||
new /obj/item/reagent_containers/food/pill/salicylic(src)
|
||||
new /obj/item/reagent_containers/food/pill/salicylic(src)
|
||||
new /obj/item/reagent_containers/food/pill/salicylic(src)
|
||||
|
||||
/obj/item/storage/pill_bottle/fakedeath/New()
|
||||
..()
|
||||
new /obj/item/reagent_containers/food/pill/fakedeath(src)
|
||||
new /obj/item/reagent_containers/food/pill/fakedeath(src)
|
||||
new /obj/item/reagent_containers/food/pill/fakedeath(src)
|
||||
@@ -207,12 +207,12 @@
|
||||
|
||||
/obj/item/storage/box/syndie_kit/caneshotgun/New()
|
||||
..()
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/dart/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/ammo_casing/shotgun/assassination(src)
|
||||
new /obj/item/gun/projectile/revolver/doublebarrel/improvised/cane(src)
|
||||
|
||||
/obj/item/storage/box/syndie_kit/mimery
|
||||
@@ -283,4 +283,4 @@ To apply, hold the injector a short distance away from the outer thigh before ap
|
||||
new /obj/item/clothing/gloves/color/latex/nitrile(src)
|
||||
new /obj/item/clothing/mask/balaclava(src)
|
||||
new /obj/item/clothing/accessory/stethoscope(src)
|
||||
new /obj/item/book/manual/engineering_hacking(src)
|
||||
new /obj/item/book/manual/engineering_hacking(src)
|
||||
@@ -206,6 +206,7 @@
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/w_class_on = WEIGHT_CLASS_BULKY
|
||||
force_unwielded = 3
|
||||
force_wielded = 34
|
||||
wieldsound = 'sound/weapons/saberon.ogg'
|
||||
@@ -277,6 +278,7 @@
|
||||
/obj/item/twohanded/dualsaber/unwield()
|
||||
..()
|
||||
hitsound = "swing_hit"
|
||||
w_class = initial(w_class)
|
||||
|
||||
/obj/item/twohanded/dualsaber/IsReflect()
|
||||
if(wielded)
|
||||
@@ -288,6 +290,7 @@
|
||||
return
|
||||
..()
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
w_class = w_class_on
|
||||
|
||||
/obj/item/twohanded/dualsaber/attackby(obj/item/W, mob/user, params)
|
||||
if(ismultitool(W))
|
||||
|
||||
@@ -42,3 +42,4 @@
|
||||
new /obj/item/clothing/glasses/meson(src)
|
||||
new /obj/item/clothing/head/soft(src)
|
||||
new /obj/item/door_remote/quartermaster(src)
|
||||
new /obj/item/organ/internal/cyberimp/eyes/meson(src)
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
new /obj/item/door_remote/chief_engineer(src)
|
||||
new /obj/item/rpd(src)
|
||||
new /obj/item/reagent_containers/food/drinks/mug/ce(src)
|
||||
new /obj/item/organ/internal/cyberimp/eyes/meson(src)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/engineering_electrical
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
new /obj/item/reagent_containers/food/drinks/bottle/bottleofbanana(src)
|
||||
new /obj/item/toy/crayon/rainbow(src)
|
||||
new /obj/item/seeds/banana(src)
|
||||
new /obj/item/restraints/handcuffs/toy(src)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
new /obj/item/laser_pointer(src)
|
||||
new /obj/item/door_remote/research_director(src)
|
||||
new /obj/item/reagent_containers/food/drinks/mug/rd(src)
|
||||
new /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic(src)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/research_reagents
|
||||
|
||||
@@ -123,6 +123,7 @@
|
||||
new /obj/item/gun/energy/gun/hos(src)
|
||||
new /obj/item/door_remote/head_of_security(src)
|
||||
new /obj/item/reagent_containers/food/drinks/mug/hos(src)
|
||||
new /obj/item/organ/internal/cyberimp/eyes/hud/security(src)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/warden
|
||||
|
||||
@@ -0,0 +1,180 @@
|
||||
/obj/structure/reflector
|
||||
name = "reflector frame"
|
||||
icon = 'icons/obj/stock_parts.dmi'
|
||||
icon_state = "box_0"
|
||||
desc = "A frame to create a reflector.\n<span class='notice'>Use <b>5</b> sheets of <b>glass</b> to create a 1 way reflector.\nUse <b>10</b> sheets of <b>reinforced glass</b> to create a 2 way reflector.\nUse <b>1 diamond</b> to create a reflector cube.</span>"
|
||||
anchored = 0
|
||||
density = 1
|
||||
layer = 3
|
||||
var/finished = 0
|
||||
|
||||
|
||||
/obj/structure/reflector/bullet_act(obj/item/projectile/P)
|
||||
var/turf/reflector_turf = get_turf(src)
|
||||
var/turf/reflect_turf
|
||||
var/new_dir = get_reflection(dir, P.dir)
|
||||
if(!istype(P, /obj/item/projectile/beam))
|
||||
return ..()
|
||||
if(new_dir)
|
||||
reflect_turf = get_step(reflect_turf, new_dir)
|
||||
else
|
||||
visible_message("<span class='notice'>[src] is hit by [P]!</span>")
|
||||
new_dir = 0
|
||||
return ..() //Hits as normal, explodes or emps or whatever
|
||||
|
||||
visible_message("<span class='notice'>[P] bounces off of [src]</span>")
|
||||
reflect_turf = get_step(loc,new_dir)
|
||||
|
||||
P.original = reflect_turf
|
||||
P.starting = reflector_turf
|
||||
P.current = reflector_turf
|
||||
P.yo = reflect_turf.y - reflector_turf.y
|
||||
P.xo = reflect_turf.x - reflector_turf.x
|
||||
new_dir = 0
|
||||
return -1
|
||||
|
||||
|
||||
/obj/structure/reflector/attackby(obj/item/W, mob/user, params)
|
||||
if(iswrench(W))
|
||||
if(anchored)
|
||||
to_chat(user, "Unweld [src] first!")
|
||||
return
|
||||
playsound(user, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
to_chat(user, "You begin to dismantle [src].")
|
||||
if(do_after(user, 80, target = src))
|
||||
playsound(user, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
to_chat(user, "You dismantle [src].")
|
||||
new /obj/item/stack/sheet/metal(src.loc, 5)
|
||||
qdel(src)
|
||||
if(istype(W, /obj/item/weldingtool))
|
||||
var/obj/item/weldingtool/WT = W
|
||||
if(!anchored)
|
||||
if(WT.remove_fuel(0,user))
|
||||
playsound(user, 'sound/items/Welder2.ogg', 50, 1)
|
||||
user.visible_message("[user.name] starts to weld [src.name] to the floor.", \
|
||||
"<span class='notice'>You start to weld [src] to the floor...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
if(do_after(user,20, target = src))
|
||||
if(!src || !WT.isOn())
|
||||
return
|
||||
anchored = 1
|
||||
to_chat(user, "<span class='notice'>You weld [src] to the floor.</span>")
|
||||
else
|
||||
if(WT.remove_fuel(0,user))
|
||||
playsound(user, 'sound/items/Welder2.ogg', 50, 1)
|
||||
user.visible_message("[user] starts to cut [src] free from the floor.", \
|
||||
"<span class='notice'>You start to cut [src] free from the floor...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
if(do_after(user,20, target = src))
|
||||
if(!src || !WT.isOn())
|
||||
return
|
||||
anchored = 0
|
||||
to_chat(user, "<span class='notice'>You cut [src] free from the floor.</span>")
|
||||
//Finishing the frame
|
||||
if(istype(W,/obj/item/stack/sheet))
|
||||
if(finished)
|
||||
return
|
||||
var/obj/item/stack/sheet/S = W
|
||||
if(istype(W, /obj/item/stack/sheet/glass))
|
||||
if(S.get_amount() < 5)
|
||||
to_chat(user, "<span class='warning'>You need five sheets of glass to create a reflector!</span>")
|
||||
return
|
||||
else
|
||||
S.use(5)
|
||||
new /obj/structure/reflector/single (src.loc)
|
||||
qdel(src)
|
||||
if(istype(W,/obj/item/stack/sheet/rglass))
|
||||
if(S.get_amount() < 10)
|
||||
to_chat(user, "<span class='warning'>You need ten sheets of reinforced glass to create a double reflector!</span>")
|
||||
return
|
||||
else
|
||||
S.use(10)
|
||||
new /obj/structure/reflector/double (src.loc)
|
||||
qdel(src)
|
||||
if(istype(W, /obj/item/stack/sheet/mineral/diamond))
|
||||
if(S.get_amount() >= 1)
|
||||
S.use(1)
|
||||
new /obj/structure/reflector/box (src.loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/reflector/proc/get_reflection(srcdir,pdir)
|
||||
return 0
|
||||
|
||||
|
||||
/obj/structure/reflector/verb/rotate()
|
||||
set name = "Rotate"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
if(anchored)
|
||||
to_chat(usr, "<span class='warning'>It is fastened to the floor!</span>")
|
||||
return 0
|
||||
dir = turn(dir, 270)
|
||||
return 1
|
||||
|
||||
|
||||
/obj/structure/reflector/AltClick(mob/user)
|
||||
..()
|
||||
if(user.incapacitated())
|
||||
to_chat(user, "<span class='warning'>You can't do that right now!</span>")
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
else
|
||||
rotate()
|
||||
|
||||
|
||||
//TYPES OF REFLECTORS, SINGLE, DOUBLE, BOX
|
||||
|
||||
//SINGLE
|
||||
|
||||
/obj/structure/reflector/single
|
||||
name = "reflector"
|
||||
icon = 'icons/obj/reflector.dmi'
|
||||
icon_state = "reflector"
|
||||
desc = "A double sided angled mirror for reflecting lasers. This one does so at a 90 degree angle."
|
||||
finished = 1
|
||||
var/static/list/rotations = list("[NORTH]" = list("[SOUTH]" = WEST, "[EAST]" = NORTH),
|
||||
"[EAST]" = list("[SOUTH]" = EAST, "[WEST]" = NORTH),
|
||||
"[SOUTH]" = list("[NORTH]" = EAST, "[WEST]" = SOUTH),
|
||||
"[WEST]" = list("[NORTH]" = WEST, "[EAST]" = SOUTH) )
|
||||
|
||||
/obj/structure/reflector/single/get_reflection(srcdir,pdir)
|
||||
var/new_dir = rotations["[srcdir]"]["[pdir]"]
|
||||
return new_dir
|
||||
|
||||
//DOUBLE
|
||||
|
||||
/obj/structure/reflector/double
|
||||
name = "double sided reflector"
|
||||
icon = 'icons/obj/reflector.dmi'
|
||||
icon_state = "reflector_double"
|
||||
desc = "A double sided angled mirror for reflecting lasers. This one does so at a 90 degree angle."
|
||||
finished = 1
|
||||
var/static/list/double_rotations = list("[NORTH]" = list("[NORTH]" = WEST, "[EAST]" = SOUTH, "[SOUTH]" = EAST, "[WEST]" = NORTH),
|
||||
"[EAST]" = list("[NORTH]" = EAST, "[WEST]" = SOUTH, "[SOUTH]" = WEST, "[EAST]" = NORTH),
|
||||
"[SOUTH]" = list("[NORTH]" = EAST, "[WEST]" = SOUTH, "[SOUTH]" = WEST, "[EAST]" = NORTH),
|
||||
"[WEST]" = list("[NORTH]" = WEST, "[EAST]" = SOUTH, "[SOUTH]" = EAST, "[WEST]" = NORTH) )
|
||||
|
||||
/obj/structure/reflector/double/get_reflection(srcdir,pdir)
|
||||
var/new_dir = double_rotations["[srcdir]"]["[pdir]"]
|
||||
return new_dir
|
||||
|
||||
//BOX
|
||||
|
||||
/obj/structure/reflector/box
|
||||
name = "reflector box"
|
||||
icon = 'icons/obj/reflector.dmi'
|
||||
icon_state = "reflector_box"
|
||||
desc = "A box with an internal set of mirrors that reflects all laser fire in a single direction."
|
||||
finished = 1
|
||||
var/static/list/box_rotations = list("[NORTH]" = list("[SOUTH]" = NORTH, "[EAST]" = NORTH, "[WEST]" = NORTH, "[NORTH]" = NORTH),
|
||||
"[EAST]" = list("[SOUTH]" = EAST, "[EAST]" = EAST, "[WEST]" = EAST, "[NORTH]" = EAST),
|
||||
"[SOUTH]" = list("[SOUTH]" = SOUTH, "[EAST]" = SOUTH, "[WEST]" = SOUTH, "[NORTH]" = SOUTH),
|
||||
"[WEST]" = list("[SOUTH]" = WEST, "[EAST]" = WEST, "[WEST]" = WEST, "[NORTH]" = WEST) )
|
||||
|
||||
/obj/structure/reflector/box/get_reflection(srcdir,pdir)
|
||||
var/new_dir = box_rotations["[srcdir]"]["[pdir]"]
|
||||
return new_dir
|
||||
@@ -313,17 +313,6 @@
|
||||
icon = 'icons/obj/statuelarge.dmi'
|
||||
icon_state = "venus"
|
||||
|
||||
/*
|
||||
/obj/structure/statue/snow
|
||||
hardness = 0.5
|
||||
material_drop_type = /obj/item/stack/sheet/mineral/snow
|
||||
|
||||
/obj/structure/statue/snow/snowman
|
||||
name = "snowman"
|
||||
desc = "Several lumps of snow put together to form a snowman."
|
||||
icon_state = "snowman"
|
||||
*/
|
||||
|
||||
/obj/structure/statue/tranquillite
|
||||
hardness = 0.5
|
||||
material_drop_type = /obj/item/stack/sheet/mineral/tranquillite
|
||||
@@ -349,8 +338,30 @@
|
||||
desc = "Seems someone made a snowman here."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "snowman"
|
||||
anchored = 1
|
||||
density = 1
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
|
||||
/obj/structure/snowman/built
|
||||
desc = "Just like the ones you remember from childhood!"
|
||||
max_integrity = 50
|
||||
|
||||
/obj/structure/snowman/built/Destroy()
|
||||
new /obj/item/reagent_containers/food/snacks/grown/carrot(drop_location())
|
||||
new /obj/item/grown/log(drop_location())
|
||||
new /obj/item/grown/log(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/structure/snowman/built/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/snowball) && obj_integrity < max_integrity)
|
||||
to_chat(user, "<span class='notice'>You patch some of the damage on [src] with [I].</span>")
|
||||
obj_integrity = max_integrity
|
||||
qdel(I)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/snowman/built/fire_act()
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/structure/kidanstatue
|
||||
name = "Obsidian Kidan warrior statue"
|
||||
|
||||
@@ -152,7 +152,7 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
|
||||
// Implants:
|
||||
// Uplink
|
||||
var/obj/item/implant/uplink/U = new /obj/item/implant/uplink(src)
|
||||
var/obj/item/implant/uplink/sit/U = new /obj/item/implant/uplink/sit(src)
|
||||
U.implant(src)
|
||||
if (flag_mgmt)
|
||||
U.hidden_uplink.uses = 500
|
||||
|
||||
@@ -280,7 +280,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if(species == "Vox")
|
||||
dat += "<b>N2 Tank:</b> <a href='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]</a><br>"
|
||||
if(species == "Grey")
|
||||
dat += "<b>Voice:</b> <a href ='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Wingdings" : "Normal"]</a><BR>"
|
||||
dat += "<b>Wingdings:</b> Set in disabilities<br>"
|
||||
dat += "<b>Voice Translator:</b> <a href ='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Secondary Language:</b> <a href='?_src_=prefs;preference=language;task=input'>[language]</a><br>"
|
||||
if(S.autohiss_basic_map)
|
||||
dat += "<b>Auto-accent:</b> <a href='?_src_=prefs;preference=autohiss_mode;task=input'>[autohiss_mode == AUTOHISS_FULL ? "Full" : (autohiss_mode == AUTOHISS_BASIC ? "Basic" : "Off")]</a><br>"
|
||||
@@ -827,29 +828,32 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
return 1
|
||||
|
||||
/datum/preferences/proc/ShowDisabilityState(mob/user,flag,label)
|
||||
/datum/preferences/proc/ShowDisabilityState(mob/user, flag, label)
|
||||
var/datum/species/S = GLOB.all_species[species]
|
||||
if(flag==DISABILITY_FLAG_FAT && !(CAN_BE_FAT in S.species_traits))
|
||||
if(flag == DISABILITY_FLAG_FAT && !(CAN_BE_FAT in S.species_traits))
|
||||
return "<li><i>[species] cannot be fat.</i></li>"
|
||||
return "<li><b>[label]:</b> <a href=\"?_src_=prefs;task=input;preference=disabilities;disability=[flag]\">[disabilities & flag ? "Yes" : "No"]</a></li>"
|
||||
|
||||
/datum/preferences/proc/SetDisabilities(mob/user)
|
||||
var/datum/species/S = GLOB.all_species[species]
|
||||
var/HTML = "<body>"
|
||||
HTML += "<tt><center>"
|
||||
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs glasses")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_COLOURBLIND,"Colourblind")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_TOURETTES,"Tourettes syndrome") // this will / can not be abused. It also SEVERELY stuns. It's just for fun.
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_NERVOUS,"Stutter")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_SWEDISH,"Swedish accent")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_LISP,"Lisp")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_DIZZY,"Dizziness")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_SCRAMBLED,"Can't speak properly")
|
||||
if(CAN_WINGDINGS in S.species_traits)
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_WINGDINGS, "Speak in Wingdings")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_NEARSIGHTED, "Needs glasses")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_FAT, "Obese")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_EPILEPTIC, "Seizures")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_DEAF, "Deaf")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_BLIND, "Blind")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_COLOURBLIND, "Colourblind")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_MUTE, "Mute")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_TOURETTES, "Tourettes syndrome") // this will / can not be abused. It also SEVERELY stuns. It's just for fun.
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_NERVOUS, "Stutter")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_SWEDISH, "Swedish accent")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_LISP, "Lisp")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_DIZZY, "Dizziness")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_SCRAMBLED, "Can't speak properly")
|
||||
|
||||
|
||||
HTML += {"</ul>
|
||||
@@ -857,7 +861,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
<a href=\"?_src_=prefs;task=reset;preference=disabilities\">\[Reset\]</a>
|
||||
</center></tt>"}
|
||||
|
||||
var/datum/browser/popup = new(user, "disabil", "<div align='center'>Choose Disabilities</div>", 350, 300)
|
||||
var/datum/browser/popup = new(user, "disabil", "<div align='center'>Choose Disabilities</div>", 350, 380)
|
||||
popup.set_content(HTML)
|
||||
popup.open(0)
|
||||
|
||||
@@ -2191,47 +2195,65 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
character.change_eye_color(e_colour)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_FAT && (CAN_BE_FAT in character.dna.species.species_traits))
|
||||
character.dna.SetSEState(FATBLOCK,1,1)
|
||||
character.dna.SetSEState(FATBLOCK, TRUE, TRUE)
|
||||
character.overeatduration = 600
|
||||
character.dna.default_blocks.Add(FATBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_NEARSIGHTED)
|
||||
character.dna.SetSEState(GLASSESBLOCK,1,1)
|
||||
character.dna.SetSEState(GLASSESBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(GLASSESBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_EPILEPTIC)
|
||||
character.dna.SetSEState(EPILEPSYBLOCK,1,1)
|
||||
character.dna.SetSEState(EPILEPSYBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(EPILEPSYBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_DEAF)
|
||||
character.dna.SetSEState(DEAFBLOCK,1,1)
|
||||
character.dna.SetSEState(DEAFBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(DEAFBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_BLIND)
|
||||
character.dna.SetSEState(BLINDBLOCK,1,1)
|
||||
character.dna.SetSEState(BLINDBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(BLINDBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_COLOURBLIND)
|
||||
character.dna.SetSEState(COLOURBLINDBLOCK,1,1)
|
||||
character.dna.SetSEState(COLOURBLINDBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(COLOURBLINDBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_MUTE)
|
||||
character.dna.SetSEState(MUTEBLOCK,1,1)
|
||||
character.dna.SetSEState(MUTEBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(MUTEBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_TOURETTES)
|
||||
character.dna.SetSEState(TWITCHBLOCK,1,1)
|
||||
character.dna.SetSEState(TWITCHBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(TWITCHBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_NERVOUS)
|
||||
character.dna.SetSEState(NERVOUSBLOCK,1,1)
|
||||
character.dna.SetSEState(NERVOUSBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(NERVOUSBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_SWEDISH)
|
||||
character.dna.SetSEState(SWEDEBLOCK,1,1)
|
||||
character.dna.SetSEState(SWEDEBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(SWEDEBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_SCRAMBLED)
|
||||
character.dna.SetSEState(SCRAMBLEBLOCK,1,1)
|
||||
character.dna.SetSEState(SCRAMBLEBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(SCRAMBLEBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_LISP)
|
||||
character.dna.SetSEState(LISPBLOCK,1,1)
|
||||
character.dna.SetSEState(LISPBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(LISPBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_DIZZY)
|
||||
character.dna.SetSEState(DIZZYBLOCK,1,1)
|
||||
character.dna.SetSEState(DIZZYBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(DIZZYBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_SCRAMBLED)
|
||||
character.dna.SetSEState(SCRAMBLEBLOCK,1,1)
|
||||
character.dna.SetSEState(SCRAMBLEBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(SCRAMBLEBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_WINGDINGS && (CAN_WINGDINGS in character.dna.species.species_traits))
|
||||
character.dna.SetSEState(WINGDINGSBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(WINGDINGSBLOCK)
|
||||
|
||||
character.dna.species.handle_dna(character)
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
var/parts[] = list() //type paths of items that will be placed in the result
|
||||
var/chem_catalysts[] = list() //like tools but for reagents
|
||||
var/category = CAT_MISC // Recipe category
|
||||
var/roundstart_enabled = TRUE //Set to FALSE if you don't want a particular crafting recipe to be available all the time
|
||||
|
||||
/datum/crafting_recipe/proc/AdjustChems(var/obj/resultobj as obj)
|
||||
//This proc is to replace the make_food proc of recipes from microwaves and such that are being converted to table crafting recipes.
|
||||
@@ -406,4 +407,14 @@
|
||||
/datum/reagent/paint/black = 30,
|
||||
/obj/item/storage/toolbox = 1) //Paint in reagents so it doesnt take the container up, yet still take it from the beaker
|
||||
tools = list(/obj/item/reagent_containers/glass/rag = 1) //need something to paint with it
|
||||
category = CAT_MISC
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/snowman
|
||||
name = "Snowman"
|
||||
result = /obj/structure/snowman/built
|
||||
reqs = list(/obj/item/snowball = 10,
|
||||
/obj/item/reagent_containers/food/snacks/grown/carrot = 1,
|
||||
/obj/item/grown/log = 2)
|
||||
time = 50
|
||||
category = CAT_MISC
|
||||
roundstart_enabled = FALSE
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
new /obj/item/a_gift(T)
|
||||
for(var/mob/living/simple_animal/pet/corgi/Ian/Ian in GLOB.mob_list)
|
||||
Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian))
|
||||
GLOB.crafting_recipes += new /datum/crafting_recipe/snowman
|
||||
//The following spawn is necessary as both the timer and the shuttle systems initialise after the events system does, so we can't add stuff to the shuttle system as it doesn't exist yet and we can't use a timer
|
||||
spawn(60 SECONDS)
|
||||
var/datum/supply_packs/xmas = SSshuttle.supply_packs["[/datum/supply_packs/misc/snow_machine]"]
|
||||
|
||||
@@ -109,14 +109,24 @@
|
||||
|
||||
/mob/living/carbon/human/handle_speech_problems(list/message_pieces, var/verb)
|
||||
var/span = ""
|
||||
var/obj/item/organ/internal/cyberimp/brain/speech_translator/translator = locate(/obj/item/organ/internal/cyberimp/brain/speech_translator) in internal_organs
|
||||
if(translator)
|
||||
if(translator.active)
|
||||
span = translator.speech_span
|
||||
for(var/datum/multilingual_say_piece/S in message_pieces)
|
||||
S.message = "<span class='[span]'>[S.message]</span>"
|
||||
verb = translator.speech_verb
|
||||
return list("verb" = verb)
|
||||
if(mind)
|
||||
span = mind.speech_span
|
||||
|
||||
if((COMIC in mutations) \
|
||||
|| (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs) \
|
||||
|| istype(get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown))
|
||||
span = "sans"
|
||||
|
||||
|
||||
if(WINGDINGS in mutations)
|
||||
span = "wingdings"
|
||||
|
||||
var/list/parent = ..()
|
||||
verb = parent["verb"]
|
||||
|
||||
|
||||
@@ -315,7 +315,7 @@
|
||||
/datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
|
||||
if(attacker_style && attacker_style.help_act(user, target))//adminfu only...
|
||||
return TRUE
|
||||
if(target.health >= config.health_threshold_crit)
|
||||
if(target.health >= config.health_threshold_crit && !(target.status_flags & FAKEDEATH))
|
||||
target.help_shake_act(user)
|
||||
return TRUE
|
||||
else
|
||||
|
||||
@@ -21,8 +21,7 @@
|
||||
|
||||
default_genes = list(REMOTE_TALK)
|
||||
|
||||
|
||||
species_traits = list(LIPS, IS_WHITELISTED, CAN_BE_FAT)
|
||||
species_traits = list(LIPS, IS_WHITELISTED, CAN_BE_FAT, CAN_WINGDINGS)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = HAS_BODY_MARKINGS
|
||||
dietflags = DIET_HERB
|
||||
@@ -33,6 +32,7 @@
|
||||
..()
|
||||
H.dna.SetSEState(REMOTETALKBLOCK, !remove, 1)
|
||||
genemutcheck(H, REMOTETALKBLOCK, null, MUTCHK_FORCED)
|
||||
H.dna.default_blocks.Add(REMOTETALKBLOCK)
|
||||
|
||||
/datum/species/grey/water_act(mob/living/carbon/human/H, volume, temperature, source)
|
||||
..()
|
||||
@@ -40,9 +40,18 @@
|
||||
H.emote("scream")
|
||||
|
||||
/datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H)
|
||||
var/speech_pref = H.client.prefs.speciesprefs
|
||||
if(speech_pref)
|
||||
H.mind.speech_span = "wingdings"
|
||||
var/translator_pref = H.client.prefs.speciesprefs
|
||||
if(translator_pref || ((ismindshielded(H) || J.is_command) && (WINGDINGS in H.mutations)))
|
||||
if(J.title == "Mime")
|
||||
return
|
||||
if(J.title == "Clown")
|
||||
var/obj/item/organ/internal/cyberimp/brain/speech_translator/clown/implant = new
|
||||
implant.insert(H)
|
||||
else
|
||||
var/obj/item/organ/internal/cyberimp/brain/speech_translator/implant = new
|
||||
implant.insert(H)
|
||||
if(!translator_pref)
|
||||
to_chat(H, "<span class='notice'>A speech translator implant has been installed due to your role on the station.</span>")
|
||||
|
||||
/datum/species/grey/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
|
||||
if(R.id == "sacid")
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
if("Magistrate")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/magistrate
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/magistrate
|
||||
if("Head of Security")
|
||||
if("Head of Security", "Special Operations Officer")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hos
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos
|
||||
if("Captain", "Blueshield")
|
||||
@@ -100,7 +100,7 @@
|
||||
if("Head of Personnel")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hop
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hop
|
||||
if("Nanotrasen Representative")
|
||||
if("Nanotrasen Representative", "Nanotrasen Navy Officer")
|
||||
suit = /obj/item/clothing/suit/space/eva/plasmaman/nt_rep
|
||||
helm = /obj/item/clothing/head/helmet/space/eva/plasmaman/nt_rep
|
||||
if("Medical Doctor","Brig Physician","Virologist")
|
||||
|
||||
@@ -369,12 +369,13 @@
|
||||
projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot
|
||||
icon_state = "foamdart_riot"
|
||||
|
||||
/obj/item/ammo_casing/shotgun/dart/assassination
|
||||
desc = "A specialist shotgun dart designed to inncapacitate and kill the target over time, so you can get very far away from your target"
|
||||
|
||||
/obj/item/ammo_casing/shotgun/dart/assassination/New()
|
||||
..()
|
||||
reagents.add_reagent("neurotoxin", 6)
|
||||
/obj/item/ammo_casing/shotgun/assassination
|
||||
name = "assassination shell"
|
||||
desc = "A specialist shrapnel shell that has been laced with a silencing toxin."
|
||||
projectile_type = /obj/item/projectile/bullet/pellet/assassination
|
||||
icon_state = "gshell"
|
||||
pellets = 6
|
||||
variance = 25
|
||||
|
||||
/obj/item/ammo_casing/cap
|
||||
desc = "A cap for children toys."
|
||||
|
||||
@@ -122,6 +122,9 @@
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/improvised
|
||||
max_ammo = 1
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/shot/improvised/cane
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/assassination
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/shot/riot
|
||||
name = "riot shotgun internal magazine"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
|
||||
|
||||
@@ -417,7 +417,7 @@
|
||||
can_unsuppress = 0
|
||||
slot_flags = null
|
||||
origin_tech = "" // NO GIVAWAYS
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised/cane
|
||||
sawn_desc = "I'm sorry, but why did you saw your cane in the first place?"
|
||||
attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed")
|
||||
fire_sound = 'sound/weapons/Gunshot_silenced.ogg'
|
||||
|
||||
@@ -109,6 +109,15 @@
|
||||
range = rand(1, 10)
|
||||
..()
|
||||
|
||||
/obj/item/projectile/bullet/pellet/assassination
|
||||
damage = 12
|
||||
tile_dropoff = 1 // slightly less damage and greater damage falloff compared to normal buckshot
|
||||
|
||||
/obj/item/projectile/bullet/pellet/assassination/on_hit(atom/target, blocked = 0)
|
||||
if(..(target, blocked))
|
||||
var/mob/living/M = target
|
||||
M.AdjustSilence(2) // HELP MIME KILLING ME IN MAINT
|
||||
|
||||
/obj/item/projectile/bullet/pellet/overload/on_hit(atom/target, blocked = 0)
|
||||
..()
|
||||
explosion(target, 0, 0, 2)
|
||||
|
||||
@@ -155,3 +155,32 @@
|
||||
if(prob(5))
|
||||
to_chat(M, "<span class='warning'>You would DIE for some [name] right now!</span>")
|
||||
return update_flags
|
||||
|
||||
/datum/reagent/proc/fakedeath(mob/living/M)
|
||||
if(M.status_flags & FAKEDEATH)
|
||||
return
|
||||
if(!(M.status_flags & CANPARALYSE))
|
||||
return
|
||||
if(M.mind && M.mind.changeling && M.mind.changeling.regenerating) //no messing with changeling's fake death
|
||||
return
|
||||
M.visible_message("<B>[M]</B> seizes up and falls limp, [M.p_their()] eyes dead and lifeless...") //so you can't trigger deathgasp emote on people. Edge case, but necessary.
|
||||
M.status_flags |= FAKEDEATH
|
||||
M.update_stat("fakedeath reagent")
|
||||
M.med_hud_set_health()
|
||||
M.med_hud_set_status()
|
||||
|
||||
/datum/reagent/proc/fakerevive(mob/living/M)
|
||||
if(!(M.status_flags & FAKEDEATH))
|
||||
return
|
||||
if(M.mind && M.mind.changeling && M.mind.changeling.regenerating)
|
||||
return
|
||||
if(M.resting)
|
||||
M.StopResting()
|
||||
M.status_flags &= ~(FAKEDEATH)
|
||||
M.update_stat("fakedeath reagent end")
|
||||
M.med_hud_set_status()
|
||||
M.med_hud_set_health()
|
||||
if(M.healthdoll)
|
||||
M.healthdoll.cached_healthdoll_overlays.Cut()
|
||||
if(M.dna.species)
|
||||
M.dna.species.handle_hud_icons(M)
|
||||
@@ -122,7 +122,7 @@
|
||||
for(var/atom/movable/X in range(range_power,pull))
|
||||
if(istype(X, /obj/effect))
|
||||
continue
|
||||
if(!X.anchored)
|
||||
if(X.move_resist <= MOVE_FORCE_DEFAULT && !X.anchored)
|
||||
var/distance = get_dist(X, pull)
|
||||
var/moving_power = max(range_power - distance, 1)
|
||||
spawn(0)
|
||||
|
||||
@@ -737,9 +737,10 @@
|
||||
var/needs_update = M.mutations.len > 0 || M.disabilities > 0
|
||||
|
||||
if(needs_update)
|
||||
for(var/block=1;block<=DNA_SE_LENGTH;block++)
|
||||
M.dna.SetSEState(block,0, 1)
|
||||
genemutcheck(M,block,null,MUTCHK_FORCED)
|
||||
for(var/block = 1; block<=DNA_SE_LENGTH; block++)
|
||||
if(!(block in M.dna.default_blocks))
|
||||
M.dna.SetSEState(block, FALSE, TRUE)
|
||||
genemutcheck(M, block, null, MUTCHK_FORCED)
|
||||
M.dna.UpdateSE()
|
||||
|
||||
M.dna.struc_enzymes = M.dna.struc_enzymes_original
|
||||
|
||||
@@ -1037,7 +1037,7 @@
|
||||
/datum/reagent/capulettium
|
||||
name = "Capulettium"
|
||||
id = "capulettium"
|
||||
description = "A rare drug that causes the user to appear dead for some time."
|
||||
description = "A rare drug that causes the user to fall unconscious and appear dead as long as it's in the body."
|
||||
reagent_state = LIQUID
|
||||
color = "#60A584"
|
||||
heart_rate_stop = 1
|
||||
@@ -1046,23 +1046,21 @@
|
||||
/datum/reagent/capulettium/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
switch(current_cycle)
|
||||
if(1 to 5)
|
||||
if(1 to 10)
|
||||
update_flags |= M.AdjustEyeBlurry(10, FALSE)
|
||||
if(6 to 10)
|
||||
M.Drowsy(10)
|
||||
if(11)
|
||||
update_flags |= M.Paralyse(10, FALSE)
|
||||
M.visible_message("<B>[M]</B> seizes up and falls limp, [M.p_their()] eyes dead and lifeless...") //so you can't trigger deathgasp emote on people. Edge case, but necessary.
|
||||
if(12 to 60)
|
||||
update_flags |= M.Paralyse(10, FALSE)
|
||||
if(61 to INFINITY)
|
||||
update_flags |= M.AdjustEyeBlurry(10, FALSE)
|
||||
fakedeath(M)
|
||||
return ..() | update_flags
|
||||
|
||||
/datum/reagent/capulettium/on_mob_delete(mob/living/M)
|
||||
if(M.status_flags & FAKEDEATH)
|
||||
fakerevive(M)
|
||||
..()
|
||||
|
||||
/datum/reagent/capulettium_plus
|
||||
name = "Capulettium Plus"
|
||||
id = "capulettium_plus"
|
||||
description = "A rare and expensive drug that causes the user to appear dead for some time while they retain consciousness and vision."
|
||||
description = "A rare and expensive drug that will silence the user and let him appear dead as long as it's in the body. Rest to play dead, stand up to wake up."
|
||||
reagent_state = LIQUID
|
||||
color = "#60A584"
|
||||
heart_rate_stop = 1
|
||||
@@ -1070,8 +1068,17 @@
|
||||
|
||||
/datum/reagent/capulettium_plus/on_mob_life(mob/living/M)
|
||||
M.Silence(2)
|
||||
if((M.status_flags & FAKEDEATH) && !M.resting)
|
||||
fakerevive(M)
|
||||
else if(!(M.status_flags & FAKEDEATH) && M.resting)
|
||||
fakedeath(M)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/capulettium_plus/on_mob_delete(mob/living/M)
|
||||
if(M.status_flags & FAKEDEATH)
|
||||
fakerevive(M)
|
||||
..()
|
||||
|
||||
/datum/reagent/toxic_slurry
|
||||
name = "Toxic Slurry"
|
||||
id = "toxic_slurry"
|
||||
|
||||
@@ -102,7 +102,8 @@
|
||||
amount_per_transfer_from_this = 10
|
||||
possible_transfer_amounts = list(10)
|
||||
volume = 10
|
||||
ignore_flags = 1 //so you can medipen through hardsuits
|
||||
ignore_flags = TRUE //so you can medipen through hardsuits
|
||||
container_type = DRAWABLE
|
||||
flags = null
|
||||
list_reagents = list("epinephrine" = 10)
|
||||
|
||||
|
||||
@@ -63,6 +63,12 @@
|
||||
icon_state = "pill21"
|
||||
list_reagents = list("initropidril" = 50)
|
||||
|
||||
/obj/item/reagent_containers/food/pill/fakedeath
|
||||
name = "fake death pill"
|
||||
desc = "Swallow then rest to appear dead, stand up to wake up. Also mutes the user's voice."
|
||||
icon_state = "pill4"
|
||||
list_reagents = list("capulettium_plus" = 50)
|
||||
|
||||
/obj/item/reagent_containers/food/pill/adminordrazine
|
||||
name = "Adminordrazine pill"
|
||||
desc = "It's magic. We don't have to explain it."
|
||||
|
||||
@@ -1135,7 +1135,7 @@
|
||||
id = "integrated_robotic_chassis"
|
||||
build_type = MECHFAB
|
||||
build_path = /mob/living/carbon/human/machine/created
|
||||
materials = list(MAT_METAL = 40000)
|
||||
materials = list(MAT_METAL = 40000, MAT_TITANIUM = 7000) //for something made from lego, they sure need a lot of metal
|
||||
construction_time = 400
|
||||
category = list("Misc")
|
||||
|
||||
@@ -1185,3 +1185,54 @@
|
||||
construction_time = 100
|
||||
build_path = /obj/item/flash/synthetic
|
||||
category = list("Misc")
|
||||
|
||||
/datum/design/voice_standard
|
||||
name = "Voice Modkit : Standard"
|
||||
desc = "A modification kit that updates a mech's onboard voice to Standard."
|
||||
id = "voice_standard"
|
||||
build_type = MECHFAB
|
||||
materials = list(MAT_METAL = 500)
|
||||
construction_time = 50
|
||||
build_path = /obj/item/mecha_modkit/voice
|
||||
category = list("Misc")
|
||||
|
||||
/datum/design/voice_nanotrasen
|
||||
name = "Voice Modkit : Nanotrasen"
|
||||
desc = "A modification kit that updates a mech's onboard voice to Nanotrasen."
|
||||
id = "voice_nanotrasen"
|
||||
build_type = MECHFAB
|
||||
materials = list(MAT_METAL = 500)
|
||||
construction_time = 50
|
||||
build_path = /obj/item/mecha_modkit/voice/nanotrasen
|
||||
category = list("Misc")
|
||||
|
||||
/datum/design/voice_silent
|
||||
name = "Voice Modkit : Silent"
|
||||
desc = "A modification kit that silences a mech's onboard voice."
|
||||
id = "voice_silent"
|
||||
build_type = MECHFAB
|
||||
materials = list(MAT_METAL = 500)
|
||||
construction_time = 50
|
||||
build_path = /obj/item/mecha_modkit/voice/silent
|
||||
category = list("Misc")
|
||||
|
||||
/datum/design/voice_honk
|
||||
name = "Voice Modkit : Honk"
|
||||
desc = "A modification kit that updates a mech's onboard voice to Honk. This is a terrible idea."
|
||||
id = "voice_honk"
|
||||
build_type = MECHFAB
|
||||
materials = list(MAT_METAL = 400, MAT_BANANIUM = 100)
|
||||
construction_time = 50
|
||||
build_path = /obj/item/mecha_modkit/voice/honk
|
||||
category = list("Misc")
|
||||
|
||||
/datum/design/voice_syndicate
|
||||
name = "Voice Modkit : Syndicate"
|
||||
desc = "A modification kit that updates a mech's onboard voice to Syndicate."
|
||||
id = "voice_syndicate"
|
||||
build_type = MECHFAB
|
||||
materials = list(MAT_METAL = 400, MAT_TITANIUM = 100)
|
||||
req_tech = list("syndicate" = 2)
|
||||
construction_time = 50
|
||||
build_path = /obj/item/mecha_modkit/voice/syndicate
|
||||
category = list("Misc")
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// Cargo orders part for high price
|
||||
// Requires high amount of power
|
||||
// Requires high level stock parts
|
||||
|
||||
/datum/station_goal/bluespace_cannon
|
||||
name = "Bluespace Artillery"
|
||||
|
||||
@@ -104,11 +105,11 @@
|
||||
var/x_max
|
||||
switch(cannon_dir)
|
||||
if(EAST)
|
||||
x_min = x - 4 //replace with defines later
|
||||
x_max = x + 6
|
||||
x_min = x - BSA_SIZE_BACK
|
||||
x_max = x + BSA_SIZE_FRONT
|
||||
if(WEST)
|
||||
x_min = x + 4
|
||||
x_max = x - 6
|
||||
x_min = x + BSA_SIZE_BACK
|
||||
x_max = x - BSA_SIZE_FRONT
|
||||
|
||||
for(var/turf/T in block(locate(x_min,y-1,z),locate(x_max,y+1,z)))
|
||||
if(T.density || isspaceturf(T))
|
||||
|
||||
@@ -3,11 +3,6 @@
|
||||
// DNA vault requires x animals ,y plants, z human dna
|
||||
// DNA vaults require high tier stock parts and cold
|
||||
// After completion each crewmember can receive single upgrade chosen out of 2 for the mob.
|
||||
#define VAULT_SPACEIMMUNE "Space Immunity"
|
||||
#define VAULT_XRAY "X-Ray Vision"
|
||||
#define VAULT_TELEKINESIS "Telekinesis"
|
||||
#define VAULT_PSYCHIC "Psychic Powers"
|
||||
#define VAULT_SPEED "Speediness"
|
||||
|
||||
/datum/station_goal/dna_vault
|
||||
name = "DNA Vault"
|
||||
@@ -17,7 +12,7 @@
|
||||
|
||||
/datum/station_goal/dna_vault/New()
|
||||
..()
|
||||
animal_count = rand(15,20) //might be too few given ~15 roundstart stationside ones
|
||||
animal_count = rand(15, 20) //might be too few given ~15 roundstart stationside ones
|
||||
human_count = rand(round(0.75 * ticker.mode.num_players_started()), ticker.mode.num_players_started()) // 75%+ roundstart population.
|
||||
var/non_standard_plants = non_standard_plants_count()
|
||||
plant_count = rand(round(0.5 * non_standard_plants),round(0.7 * non_standard_plants))
|
||||
@@ -302,3 +297,4 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/
|
||||
H.dna.SetSEState(block, 1, 1)
|
||||
H.mutations |= power
|
||||
genemutcheck(H, block, null, MUTCHK_FORCED)
|
||||
H.dna.default_blocks.Add(block) //prevent removal by mutadone
|
||||
|
||||
@@ -142,6 +142,44 @@
|
||||
spawn(90 / severity)
|
||||
crit_fail = 0
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/clown_voice
|
||||
name = "Comical implant"
|
||||
desc = "<span class='sans'>Uh oh.</span>"
|
||||
implant_color = "#DEDE00"
|
||||
slot = "brain_clownvoice"
|
||||
origin_tech = "materials=2;biotech=2"
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/speech_translator //actual translating done in human/handle_speech_problems
|
||||
name = "Speech translator implant"
|
||||
desc = "While known as a translator, this implant actually generates speech based on the user's thoughts when activated, completely bypassing the need to speak."
|
||||
implant_color = "#C0C0C0"
|
||||
slot = "brain_speechtranslator"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
origin_tech = "materials=4;biotech=6"
|
||||
actions_types = list(/datum/action/item_action/organ_action/toggle)
|
||||
var/active = TRUE
|
||||
var/speech_span = ""
|
||||
var/speech_verb = "states"
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/speech_translator/clown
|
||||
name = "Comical speech translator implant"
|
||||
implant_color = "#DEDE00"
|
||||
speech_span = "sans"
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/speech_translator/emp_act(severity)
|
||||
if(emp_proof)
|
||||
return
|
||||
if(owner && active)
|
||||
to_chat(owner, "<span class='notice'>Your translator's safeties trigger, it is now turned off.</span>")
|
||||
active = FALSE
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/speech_translator/ui_action_click()
|
||||
if(owner && !active)
|
||||
to_chat(owner, "<span class='notice'>You turn on your translator implant.</span>")
|
||||
active = TRUE
|
||||
else if(owner && active)
|
||||
to_chat(owner, "<span class='notice'>You turn off your translator implant.</span>")
|
||||
active = FALSE
|
||||
|
||||
//[[[[MOUTH]]]]
|
||||
/obj/item/organ/internal/cyberimp/mouth
|
||||
@@ -162,13 +200,6 @@
|
||||
to_chat(owner, "<span class='warning'>Your breathing tube suddenly closes!</span>")
|
||||
owner.AdjustLoseBreath(2)
|
||||
|
||||
/obj/item/organ/internal/cyberimp/brain/clown_voice
|
||||
name = "Comical implant"
|
||||
desc = "<span class='sans'>Uh oh.</span>"
|
||||
implant_color = "#DEDE00"
|
||||
slot = "brain_clownvoice"
|
||||
origin_tech = "materials=2;biotech=2"
|
||||
|
||||
//[[[[CHEST]]]]
|
||||
/obj/item/organ/internal/cyberimp/chest
|
||||
name = "cybernetic torso implant"
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
var/safe_toxins_max = 0.05
|
||||
var/SA_para_min = 1 //Sleeping agent
|
||||
var/SA_sleep_min = 5 //Sleeping agent
|
||||
var/gas_toxicity_multiplier = 100
|
||||
|
||||
var/oxy_breath_dam_min = MIN_TOXIC_GAS_DAMAGE
|
||||
var/oxy_breath_dam_max = MAX_TOXIC_GAS_DAMAGE
|
||||
@@ -117,7 +118,7 @@
|
||||
//Too much oxygen! //Yes, some species may not like it.
|
||||
if(safe_oxygen_max)
|
||||
if(O2_pp > safe_oxygen_max)
|
||||
var/ratio = (breath.oxygen/safe_oxygen_max) * 10
|
||||
var/ratio = (breath.oxygen/safe_oxygen_max) * gas_toxicity_multiplier
|
||||
H.apply_damage_type(Clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type)
|
||||
H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy)
|
||||
else
|
||||
@@ -144,7 +145,7 @@
|
||||
//Too much nitrogen!
|
||||
if(safe_nitro_max)
|
||||
if(N2_pp > safe_nitro_max)
|
||||
var/ratio = (breath.nitrogen/safe_nitro_max) * 10
|
||||
var/ratio = (breath.nitrogen/safe_nitro_max) * gas_toxicity_multiplier
|
||||
H.apply_damage_type(Clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type)
|
||||
H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro)
|
||||
else
|
||||
@@ -208,7 +209,7 @@
|
||||
//Too much toxins!
|
||||
if(safe_toxins_max)
|
||||
if(Toxins_pp > safe_toxins_max)
|
||||
var/ratio = (breath.toxins/safe_toxins_max) * 10
|
||||
var/ratio = (breath.toxins/safe_toxins_max) * gas_toxicity_multiplier
|
||||
H.apply_damage_type(Clamp(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type)
|
||||
H.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
|
||||
else
|
||||
@@ -325,7 +326,7 @@
|
||||
desc = "They're filled with dust....wow."
|
||||
|
||||
safe_oxygen_min = 0 //We don't breathe this
|
||||
safe_oxygen_max = 1 //This is toxic to us
|
||||
safe_oxygen_max = 0.05 //This is toxic to us
|
||||
safe_nitro_min = 16 //We breathe THIS!
|
||||
oxy_damage_type = TOX //And it poisons us
|
||||
|
||||
|
||||
Reference in New Issue
Block a user