mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-26 14:39:58 +01:00
Merge branch 'master' of https://github.com/tgstation/-tg-station into alanedaggerpoe
Conflicts: code/modules/paperwork/pen.dm
This commit is contained in:
@@ -19,4 +19,5 @@ var/datum/subsystem/mobs/SSmob
|
||||
if(thing)
|
||||
thing:Life(seconds)
|
||||
continue
|
||||
WARNING("Found a null in the mob list. Removing.")
|
||||
mob_list.Remove(thing)
|
||||
@@ -157,6 +157,20 @@
|
||||
cast_sound = "sound/magic/ForceWall.ogg"
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop
|
||||
name = "Stop Time"
|
||||
desc = "This spell stops time for everyone except for you, allowing you to move freely while your enemies and even projectiles are frozen."
|
||||
charge_max = 300
|
||||
clothes_req = 1
|
||||
invocation = "TOKI WO TOMARE"
|
||||
invocation_type = "shout"
|
||||
range = 0
|
||||
cooldown_min = 90
|
||||
summon_amt = 1
|
||||
action_icon_state = "time"
|
||||
|
||||
summon_type = list(/obj/effect/timestop/wizard)
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/conjure/carp
|
||||
name = "Summon Carp"
|
||||
desc = "This spell conjures a simple carp."
|
||||
@@ -319,4 +333,4 @@
|
||||
var/mob/living/M = AM
|
||||
M.Weaken(2)
|
||||
M << "<span class='userdanger'>You're thrown back by a mystical force!</span>"
|
||||
spawn(0) AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time.
|
||||
spawn(0) AM.throw_at(throwtarget, ((Clamp((maxthrow - (Clamp(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user)//So stuff gets tossed around at the same time.
|
||||
|
||||
@@ -303,10 +303,10 @@ var/list/uplink_items = list()
|
||||
cost = 2
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/bulltoxin
|
||||
name = "Drum Magazine - 12g Bioterror"
|
||||
desc = "An alternative 8-round toxic magazine for use in the Bulldog shotgun. Contains debilitating toxins to make your target die an excruciatingly rapid death."
|
||||
item = /obj/item/ammo_box/magazine/m12g/bioterror
|
||||
/datum/uplink_item/ammo/bioterror
|
||||
name = "Box of Bioterror Syringes"
|
||||
desc = "A box full of preloaded syringes, containing various chemicals that seize up the victim's motor and broca system , making it impossible for them to move or speak while in their system."
|
||||
item = /obj/item/weapon/storage/box/syndie_kit/bioterror
|
||||
cost = 6
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
@@ -353,12 +353,6 @@ var/list/uplink_items = list()
|
||||
cost = 6
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/edagger
|
||||
name = "Energy Dagger"
|
||||
desc = "A dagger made of energy that looks and functions as a pen when off."
|
||||
item = /obj/item/weapon/pen/edagger
|
||||
cost = 3
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/foampistol
|
||||
name = "Toy Gun (with Stun Darts)"
|
||||
desc = "An innocent-looking toy pistol designed to fire foam darts. Comes loaded with riot-grade darts, to incapacitate a target."
|
||||
|
||||
@@ -82,8 +82,10 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
|
||||
//And then set it up to be handed out in forge_changeling_objectives
|
||||
var/list/team_objectives = typesof(/datum/objective/changeling_team_objective) - /datum/objective/changeling_team_objective
|
||||
var/list/possible_team_objectives = list()
|
||||
for(var/datum/objective/changeling_team_objective/T in team_objectives)
|
||||
if(changelings.len >= initial(T.min_lings))
|
||||
for(var/T in team_objectives)
|
||||
var/datum/objective/changeling_team_objective/CTO = T
|
||||
|
||||
if(changelings.len >= initial(CTO.min_lings))
|
||||
possible_team_objectives += T
|
||||
|
||||
if(possible_team_objectives.len && prob(20*changelings.len))
|
||||
@@ -114,6 +116,14 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
|
||||
//No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting
|
||||
//If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone
|
||||
|
||||
var/escape_objective_possible = TRUE
|
||||
|
||||
//if there's a team objective, check if it's compatible with escape objectives
|
||||
for(var/datum/objective/changeling_team_objective/CTO in changeling.objectives)
|
||||
if(!CTO.escape_objective_compatible)
|
||||
escape_objective_possible = FALSE
|
||||
break
|
||||
|
||||
var/datum/objective/absorb/absorb_objective = new
|
||||
absorb_objective.owner = changeling
|
||||
absorb_objective.gen_amount_goal(6, 8)
|
||||
@@ -149,14 +159,15 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
|
||||
maroon_objective.find_target()
|
||||
changeling.objectives += maroon_objective
|
||||
|
||||
if (!(locate(/datum/objective/escape) in changeling.objectives))
|
||||
if (!(locate(/datum/objective/escape) in changeling.objectives) && escape_objective_possible)
|
||||
var/datum/objective/escape/escape_with_identity/identity_theft = new
|
||||
identity_theft.owner = changeling
|
||||
identity_theft.target = maroon_objective.target
|
||||
identity_theft.update_explanation_text()
|
||||
changeling.objectives += identity_theft
|
||||
escape_objective_possible = FALSE
|
||||
|
||||
if (!(locate(/datum/objective/escape) in changeling.objectives))
|
||||
if (!(locate(/datum/objective/escape) in changeling.objectives) && escape_objective_possible)
|
||||
if(prob(50))
|
||||
var/datum/objective/escape/escape_objective = new
|
||||
escape_objective.owner = changeling
|
||||
@@ -164,8 +175,12 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
|
||||
else
|
||||
var/datum/objective/escape/escape_with_identity/identity_theft = new
|
||||
identity_theft.owner = changeling
|
||||
identity_theft.find_target()
|
||||
if(team_mode)
|
||||
identity_theft.find_target_by_role(role = "Changeling", role_type = 1, invert = 1)
|
||||
else
|
||||
identity_theft.find_target()
|
||||
changeling.objectives += identity_theft
|
||||
escape_objective_possible = FALSE
|
||||
|
||||
|
||||
|
||||
@@ -265,7 +280,7 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
|
||||
//var/list/absorbed_dna = list()
|
||||
//var/list/protected_dna = list() //dna that is not lost when capacity is otherwise full
|
||||
var/dna_max = 6 //How many extra DNA strands the changeling can store for transformation.
|
||||
var/absorbedcount = 1 //We would require at least 1 sample of compatible DNA to have taken on the form of a human.
|
||||
var/absorbedcount = 0
|
||||
var/chem_charges = 20
|
||||
var/chem_storage = 75
|
||||
var/chem_recharge_rate = 1
|
||||
@@ -349,7 +364,7 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
|
||||
prof.dna = new_dna
|
||||
prof.name = H.real_name
|
||||
prof.protected = protect
|
||||
|
||||
|
||||
var/list/slots = list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store")
|
||||
for(var/slot in slots)
|
||||
var/obj/item/I = H.vars[slot]
|
||||
@@ -363,6 +378,7 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
|
||||
prof.exists_list[slot] = 1
|
||||
|
||||
stored_profiles += prof
|
||||
absorbedcount++
|
||||
|
||||
return prof
|
||||
|
||||
@@ -425,7 +441,7 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
|
||||
|
||||
/datum/changelingprofile
|
||||
var/name = "a bug"
|
||||
|
||||
|
||||
var/protected = 0
|
||||
|
||||
var/datum/dna/dna = null
|
||||
@@ -435,6 +451,6 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
|
||||
var/list/exists_list = list()
|
||||
var/list/item_color_list = list()
|
||||
var/list/item_state_list = list()
|
||||
|
||||
|
||||
/datum/changelingprofile/Destroy()
|
||||
qdel(dna)
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
/datum/objective/assassinate/find_target_by_role(role, role_type=0, invert=0)
|
||||
if(!invert)
|
||||
target_role_type = role_type
|
||||
..(role, role_type)
|
||||
..()
|
||||
return target
|
||||
|
||||
/datum/objective/assassinate/check_completion()
|
||||
@@ -93,7 +93,7 @@
|
||||
/datum/objective/mutiny/find_target_by_role(role, role_type=0,invert=0)
|
||||
if(!invert)
|
||||
target_role_type = role_type
|
||||
..(role, role_type)
|
||||
..()
|
||||
return target
|
||||
|
||||
/datum/objective/mutiny/check_completion()
|
||||
@@ -123,7 +123,7 @@
|
||||
/datum/objective/maroon/find_target_by_role(role, role_type=0, invert=0)
|
||||
if(!invert)
|
||||
target_role_type = role_type
|
||||
..(role, role_type)
|
||||
..()
|
||||
return target
|
||||
|
||||
/datum/objective/maroon/check_completion()
|
||||
@@ -149,7 +149,7 @@
|
||||
/datum/objective/debrain/find_target_by_role(role, role_type=0, invert=0)
|
||||
if(!invert)
|
||||
target_role_type = role_type
|
||||
..(role, role_type)
|
||||
..()
|
||||
return target
|
||||
|
||||
/datum/objective/debrain/check_completion()
|
||||
@@ -183,7 +183,7 @@
|
||||
/datum/objective/protect/find_target_by_role(role, role_type=0, invert=0)
|
||||
if(!invert)
|
||||
target_role_type = role_type
|
||||
..(role, role_type)
|
||||
..()
|
||||
return target
|
||||
|
||||
/datum/objective/protect/check_completion()
|
||||
@@ -668,7 +668,7 @@ var/global/list/possible_items_special = list()
|
||||
martyr_compatible = 0 //Suicide is not teamwork!
|
||||
explanation_text = "Changeling Friendship!"
|
||||
var/min_lings = 3 //Minimum amount of lings for this team objective to be possible
|
||||
|
||||
var/escape_objective_compatible = FALSE
|
||||
|
||||
|
||||
//Impersonate department
|
||||
@@ -701,13 +701,18 @@ var/global/list/possible_items_special = list()
|
||||
var/ling_count = ticker.mode.changelings
|
||||
|
||||
for(var/datum/mind/M in ticker.minds)
|
||||
if(department_head in M.assigned_job.department_head)
|
||||
if(M in ticker.mode.changelings)
|
||||
continue
|
||||
if(department_head in get_department_heads(M.assigned_role))
|
||||
if(ling_count)
|
||||
ling_count--
|
||||
department_minds += M
|
||||
department_real_names += M.current.real_name
|
||||
else
|
||||
break
|
||||
|
||||
if(!department_minds.len)
|
||||
log_game("[type] has failed to find department staff, and has removed itself. the round will continue normally")
|
||||
owner.objectives -= src
|
||||
qdel(src)
|
||||
return
|
||||
@@ -724,16 +729,19 @@ var/global/list/possible_items_special = list()
|
||||
var/needed_heads = rand(min_lings,command_positions.len)
|
||||
needed_heads = min(ticker.mode.changelings.len,needed_heads)
|
||||
|
||||
for(var/datum/mind/possible_head in ticker.minds)
|
||||
if(possible_head in ticker.mode.changelings) //Looking at you HoP.
|
||||
var/list/heads = ticker.mode.get_living_heads()
|
||||
for(var/datum/mind/head in heads)
|
||||
if(head in ticker.mode.changelings) //Looking at you HoP.
|
||||
continue
|
||||
if(possible_head.assigned_job.title in command_positions)
|
||||
if(needed_heads)
|
||||
department_minds += possible_head
|
||||
department_real_names += possible_head.current.real_name
|
||||
needed_heads--
|
||||
if(needed_heads)
|
||||
department_minds += head
|
||||
department_real_names += head.current.real_name
|
||||
needed_heads--
|
||||
else
|
||||
break
|
||||
|
||||
if(!department_minds.len)
|
||||
log_game("[type] has failed to find department heads, and has removed itself. the round will continue normally")
|
||||
owner.objectives -= src
|
||||
qdel(src)
|
||||
return
|
||||
@@ -783,6 +791,9 @@ var/global/list/possible_items_special = list()
|
||||
|
||||
//Check each department member's mind to see if any of them made it to centcomm alive, if they did it's an automatic fail
|
||||
for(var/datum/mind/M in department_minds)
|
||||
if(M in ticker.mode.changelings) //Lings aren't picked for this, but let's be safe
|
||||
continue
|
||||
|
||||
if(M.current)
|
||||
var/turf/mloc = get_turf(M.current)
|
||||
if(mloc.onCentcom() && (M.current.stat != DEAD))
|
||||
|
||||
@@ -119,6 +119,11 @@
|
||||
spell_type = /obj/effect/proc_holder/spell/aoe_turf/repulse
|
||||
log_name = "RP"
|
||||
|
||||
/datum/spellbook_entry/timestop
|
||||
name = "Time Stop"
|
||||
spell_type = /obj/effect/proc_holder/spell/aoe_turf/conjure/timestop
|
||||
log_name = "TS"
|
||||
|
||||
/datum/spellbook_entry/smoke
|
||||
name = "Smoke"
|
||||
spell_type = /obj/effect/proc_holder/spell/targeted/smoke
|
||||
|
||||
@@ -125,3 +125,15 @@ var/list/nonhuman_positions = list(
|
||||
|
||||
/proc/guest_jobbans(job)
|
||||
return ((job in command_positions) || (job in nonhuman_positions) || (job in security_positions))
|
||||
|
||||
|
||||
|
||||
//this is necessary because antags happen before job datums are handed out, but NOT before they come into existence
|
||||
//so I can't simply use job datum.department_head straight from the mind datum, laaaaame.
|
||||
/proc/get_department_heads(var/job_title)
|
||||
if(!job_title)
|
||||
return list()
|
||||
|
||||
for(var/datum/job/J in SSjob.occupations)
|
||||
if(J.title == job_title)
|
||||
return J.department_head //this is a list
|
||||
@@ -137,6 +137,20 @@
|
||||
O.update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/bioterror
|
||||
name = "bioterror syringe box"
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/bioterror/New()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
|
||||
new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
|
||||
new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
|
||||
new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
|
||||
new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
|
||||
new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
|
||||
new /obj/item/weapon/reagent_containers/syringe/bioterror(src)
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/imp_adrenal
|
||||
name = "boxed adrenal implant (with injector)"
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
reagents.add_reagent("morphine", 20)
|
||||
reagents.add_reagent("mutetoxin", 15)
|
||||
reagents.add_reagent("tirizene", 10)
|
||||
..()
|
||||
..()
|
||||
|
||||
/*
|
||||
* (Alan) Edaggers
|
||||
@@ -119,4 +119,4 @@
|
||||
item_state = "edagger"
|
||||
else
|
||||
icon_state = initial(icon_state) //looks like a normal pen when off.
|
||||
item_state = initial(item_state)
|
||||
item_state = initial(item_state)
|
||||
|
||||
@@ -243,7 +243,7 @@
|
||||
|
||||
new_mob << "<B>Your form morphs into that of a [randomize].</B>"
|
||||
|
||||
del(M)
|
||||
qdel(M)
|
||||
return new_mob
|
||||
|
||||
/obj/item/projectile/magic/animate
|
||||
|
||||
@@ -579,7 +579,7 @@
|
||||
var/mob/mob = get_mob_by_key(holder.my_atom.fingerprintslast)
|
||||
var/obj/effect/timestop/T = new /obj/effect/timestop
|
||||
T.loc = get_turf(holder.my_atom)
|
||||
T.immune = mob
|
||||
T.immune += mob
|
||||
T.timestop()
|
||||
|
||||
|
||||
|
||||
@@ -221,6 +221,11 @@
|
||||
desc = "Contains antiviral agents."
|
||||
list_reagents = list("spaceacillin" = 15)
|
||||
|
||||
/obj/item/weapon/reagent_containers/syringe/bioterror
|
||||
name = "bioterror syringe"
|
||||
desc = "Contains several paralyzing reagents."
|
||||
list_reagents = list("neurotoxin" = 5, "mutetoxin" = 5, "sodium_thiopental" = 5)
|
||||
|
||||
/obj/item/weapon/reagent_containers/syringe/stimulants
|
||||
name = "Stimpack"
|
||||
desc = "Contains stimulants."
|
||||
|
||||
@@ -410,7 +410,7 @@
|
||||
var/mob/living/carbon/human/G = new /mob/living/carbon/human
|
||||
if(prob(50)) G.gender = "female"
|
||||
hardset_dna(G, null, null, null, null, /datum/species/golem/adamantine)
|
||||
|
||||
|
||||
G.set_cloned_appearance()
|
||||
G.real_name = text("Adamantine Golem ([rand(1, 1000)])")
|
||||
G.dna.species.auto_equip(G)
|
||||
@@ -436,13 +436,16 @@
|
||||
pixel_x = -64
|
||||
pixel_y = -64
|
||||
unacidable = 1
|
||||
var/mob/living/immune = null // the one who creates the timestop is immune
|
||||
var/mob/living/immune = list() // the one who creates the timestop is immune
|
||||
var/freezerange = 2
|
||||
var/duration = 140
|
||||
alpha = 125
|
||||
|
||||
/obj/effect/timestop/New()
|
||||
..()
|
||||
for(var/mob/living/M in player_list)
|
||||
for(var/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop/T in M.mind.spell_list) //People who can stop time are immune to timestop
|
||||
immune |= M
|
||||
timestop()
|
||||
|
||||
|
||||
@@ -451,7 +454,7 @@
|
||||
while(loc)
|
||||
if(duration)
|
||||
for(var/mob/living/M in orange (freezerange, src.loc))
|
||||
if(M == immune)
|
||||
if(M in immune)
|
||||
continue
|
||||
M.stunned = 10
|
||||
M.anchored = 1
|
||||
@@ -478,6 +481,9 @@
|
||||
sleep(1)
|
||||
|
||||
|
||||
/obj/effect/timestop/wizard
|
||||
duration = 90
|
||||
|
||||
|
||||
/obj/item/stack/tile/bluespace
|
||||
name = "bluespace floor tile"
|
||||
|
||||
@@ -59,6 +59,8 @@
|
||||
<h3 class="author">Miauw updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Changeling transformations have been upgraded to also include clothing instead of just DNA.</li>
|
||||
<li class="tweak">Patches no longer work on dead people.</li>
|
||||
<li class="rscadd">Added 15-force edaggers that function like pens when off.</li>
|
||||
</ul>
|
||||
<h3 class="author">MrPerson updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
|
||||
@@ -1562,6 +1562,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
Miauw:
|
||||
- rscadd: Changeling transformations have been upgraded to also include clothing
|
||||
instead of just DNA.
|
||||
- tweak: Patches no longer work on dead people.
|
||||
- rscadd: Added 15-force edaggers that function like pens when off.
|
||||
MrPerson:
|
||||
- rscadd: Objects being dragged will no longer get shoved out of your grasp by space
|
||||
wind. Retrieving dead bodies should be possible.
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
################################
|
||||
# Example Changelog File
|
||||
#
|
||||
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
|
||||
#
|
||||
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
|
||||
# When it is, any changes listed below will disappear.
|
||||
#
|
||||
# Valid Prefixes:
|
||||
# bugfix
|
||||
# wip (For works in progress)
|
||||
# tweak
|
||||
# soundadd
|
||||
# sounddel
|
||||
# rscadd (general adding of nice things)
|
||||
# rscdel (general deleting of nice things)
|
||||
# imageadd
|
||||
# imagedel
|
||||
# spellcheck (typo fixes)
|
||||
# experiment
|
||||
# tgs (TG-ported fixes?)
|
||||
#################################
|
||||
|
||||
# Your name.
|
||||
author: Kor
|
||||
|
||||
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||
delete-after: True
|
||||
|
||||
# Any changes you've made. See valid prefix list above.
|
||||
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
|
||||
# SCREW THIS UP AND IT WON'T WORK.
|
||||
# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
|
||||
# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
|
||||
changes:
|
||||
- rscadd: "The wizard can now stop time."
|
||||
@@ -0,0 +1,9 @@
|
||||
|
||||
author: MMMiracles
|
||||
|
||||
|
||||
delete-after: True
|
||||
|
||||
changes:
|
||||
- tweak: "Revamps bioterror darts into a less-lethal, syringe form. Removed the coniine and spore toxins to keep it solely for quiet take-downs."
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
#miauw wuz heer xd
|
||||
author: Miauw
|
||||
|
||||
delete-after: True
|
||||
|
||||
changes:
|
||||
- tweak: "Patches no longer work on dead people."
|
||||
@@ -1,7 +0,0 @@
|
||||
#insert dank meme here
|
||||
author: Miauw
|
||||
|
||||
delete-after: True
|
||||
|
||||
changes:
|
||||
- rscadd: "Added 15-force edaggers that function like pens when off."
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 96 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 94 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
Reference in New Issue
Block a user