merge conflict fix, reset map

This commit is contained in:
Kyep
2019-01-07 16:37:07 -08:00
90 changed files with 2022 additions and 1917 deletions
+7 -2
View File
@@ -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
+8
View File
@@ -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"
+5 -1
View File
@@ -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)
+1
View File
@@ -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
+1
View File
@@ -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
+21 -1
View File
@@ -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"
+2 -2
View File
@@ -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,
+1
View File
@@ -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)
+21 -29
View File
@@ -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"
+10 -2
View File
@@ -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."
+69
View File
@@ -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
..()
+1
View File
@@ -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!
+12
View File
@@ -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
+1 -78
View File
@@ -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()
+31 -7
View File
@@ -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.")
+1
View File
@@ -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)
-18
View File
@@ -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
+1 -1
View File
@@ -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")
+9 -2
View File
@@ -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."
+4 -4
View File
@@ -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"
+2 -3
View File
@@ -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
+84 -9
View File
@@ -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()
+1
View File
@@ -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()
..()
+1
View File
@@ -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()
+2
View File
@@ -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()
..()
+2 -1
View File
@@ -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()
..()
+2 -2
View File
@@ -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 ..()
+59 -4
View File
@@ -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
+1 -1
View File
@@ -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()
+78
View File
@@ -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
+5 -1
View File
@@ -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)
+6 -6
View File
@@ -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
+17 -1
View File
@@ -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
+10
View File
@@ -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
+2 -1
View File
@@ -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
+180
View File
@@ -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
+24 -13
View File
@@ -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
+53 -31
View File
@@ -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)
+12 -1
View File
@@ -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
+1
View File
@@ -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]"]
+12 -2
View File
@@ -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")
+5 -4
View File
@@ -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))
+2 -6
View File
@@ -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"
+5 -4
View File
@@ -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