mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 12:07:27 +01:00
Merge remote-tracking branch 'upstream/master' into night_shift
# Conflicts: # code/world.dm
This commit is contained in:
@@ -13,6 +13,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
var/emergencyCallTime = 6000 //time taken for emergency shuttle to reach the station when called (in deciseconds)
|
||||
var/emergencyDockTime = 1800 //time taken for emergency shuttle to leave again once it has docked (in deciseconds)
|
||||
var/emergencyEscapeTime = 1200 //time taken for emergency shuttle to reach a safe distance after leaving station (in deciseconds)
|
||||
var/emergency_sec_level_time = 0 // time sec level was last raised to red or higher
|
||||
var/area/emergencyLastCallLoc
|
||||
var/emergencyNoEscape
|
||||
|
||||
@@ -134,7 +135,11 @@ DECLARE_GLOBAL_CONTROLLER(shuttle, shuttle_master)
|
||||
var/area/signal_origin = get_area(user)
|
||||
var/emergency_reason = "\nNature of emergency:\n\n[call_reason]"
|
||||
if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes.
|
||||
emergency.request(null, 0.5, signal_origin, html_decode(emergency_reason), 1)
|
||||
var/extra_minutes = 0
|
||||
var/priority_time = emergencyCallTime * 0.5
|
||||
if(world.time - emergency_sec_level_time < priority_time)
|
||||
extra_minutes = 5
|
||||
emergency.request(null, 0.5 + extra_minutes / (emergencyCallTime / 600), signal_origin, html_decode(emergency_reason), 1)
|
||||
else
|
||||
emergency.request(null, 1, signal_origin, html_decode(emergency_reason), 0)
|
||||
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
/datum/disease/kingstons
|
||||
name = "Kingstons Syndrome"
|
||||
max_stages = 4
|
||||
spread_text = "Airborne"
|
||||
cure_text = "Milk"
|
||||
cures = list("milk")
|
||||
cure_chance = 50
|
||||
agent = "Nya Virus"
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
permeability_mod = 0.75
|
||||
desc = "If left untreated the subject will turn into a feline. In felines it has... OTHER... effects."
|
||||
severity = DANGEROUS
|
||||
|
||||
/datum/disease/kingstons/stage_act()
|
||||
..()
|
||||
switch(stage)
|
||||
if(1)
|
||||
if(prob(10))
|
||||
if(affected_mob.get_species() == "Tajaran")
|
||||
to_chat(affected_mob, "<span class='notice'>You feel good.</span>")
|
||||
else
|
||||
to_chat(affected_mob, "<span class='notice'>You feel like playing with string.</span>")
|
||||
if(2)
|
||||
if(prob(10))
|
||||
if(affected_mob.get_species() == "Tajaran")
|
||||
to_chat(affected_mob, "<span class='danger'>Something in your throat itches.</span>")
|
||||
else
|
||||
to_chat(affected_mob, "<span class='danger'>You NEED to find a mouse.</span>")
|
||||
if(3)
|
||||
if(prob(10))
|
||||
if(affected_mob.get_species() == "Tajaran")
|
||||
to_chat(affected_mob, "<span class='danger'>You feel something in your throat!</span>")
|
||||
affected_mob.emote("cough")
|
||||
else
|
||||
affected_mob.say(pick(list("Mew", "Meow!", "Nya!~")))
|
||||
if(4)
|
||||
if(prob(5))
|
||||
if(affected_mob.get_species() == "Tajaran")
|
||||
affected_mob.visible_message("<span class='danger'>[affected_mob] coughs up a hairball!</span>", \
|
||||
"<span class='userdanger'>You cough up a hairball!</span>")
|
||||
affected_mob.Stun(5)
|
||||
else
|
||||
affected_mob.visible_message("<span class='danger'>[affected_mob]'s form contorts into something more feline!</span>", \
|
||||
"<span class='userdanger'>YOU TURN INTO A TAJARAN!</span>")
|
||||
var/mob/living/carbon/human/catface = affected_mob
|
||||
catface.set_species("Tajaran")
|
||||
|
||||
|
||||
/datum/disease/kingstons/advanced
|
||||
name = "Advanced Kingstons Syndrome"
|
||||
spread_text = "Airborne"
|
||||
cure_text = "Plasma"
|
||||
cures = list("plasma")
|
||||
cure_chance = 50
|
||||
agent = "AMB45DR Bacteria"
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
permeability_mod = 0.75
|
||||
desc = "If left untreated the subject will mutate to a different species."
|
||||
severity = BIOHAZARD
|
||||
var/list/virspecies = list("Human", "Tajaran", "Unathi", "Skrell", "Vulpkanin")//no karma races sorrys.
|
||||
var/list/virsuffix = list("pox", "rot", "flu", "cough", "-gitis", "cold", "rash", "itch", "decay")
|
||||
var/chosentype
|
||||
var/chosensuff
|
||||
|
||||
/datum/disease/kingstons/advanced/New()
|
||||
chosentype = pick(virspecies)
|
||||
chosensuff = pick(virsuffix)
|
||||
|
||||
name = "[chosentype] [chosensuff]"
|
||||
|
||||
/datum/disease/kingstons/advanced/stage_act()
|
||||
..()
|
||||
switch(stage)
|
||||
if(1)
|
||||
if(prob(10))
|
||||
to_chat(affected_mob, "<span class='notice'>You feel awkward.</span>")
|
||||
if(2)
|
||||
if(prob(10))
|
||||
to_chat(affected_mob, "<span class='danger'>You itch.</span>")
|
||||
if(3)
|
||||
if(prob(10))
|
||||
to_chat(affected_mob, "<span class='danger'>Your skin starts to flake!</span>")
|
||||
|
||||
if(4)
|
||||
if(prob(5))
|
||||
if(affected_mob.get_species() != chosentype)
|
||||
affected_mob.visible_message("<span class='danger'>[affected_mob]'s skin splits and form contorts!</span>", \
|
||||
"<span class='userdanger'>Your body mutates into a [chosentype]!</span>")
|
||||
var/mob/living/carbon/human/twisted = affected_mob
|
||||
twisted.set_species(chosentype)
|
||||
else
|
||||
affected_mob.visible_message("<span class='danger'>[affected_mob] scratches at thier skin!</span>", \
|
||||
"<span class='userdanger'>You scratch your skin to try not to itch!</span>")
|
||||
affected_mob.adjustBruteLoss(-5)
|
||||
affected_mob.adjustStaminaLoss(5)
|
||||
@@ -0,0 +1,45 @@
|
||||
/datum/disease/lycan
|
||||
name = "Lycancoughy"
|
||||
form = "Infection"
|
||||
max_stages = 4
|
||||
spread_text = "On contact"
|
||||
spread_flags = CONTACT_GENERAL
|
||||
cure_text = "Ethanol"
|
||||
cures = list("ethanol")
|
||||
agent = "Excess Snuggles"
|
||||
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey)
|
||||
desc = "If left untreated subject will regurgitate... puppies."
|
||||
severity = MEDIUM
|
||||
|
||||
/datum/disease/lycan/stage_act()
|
||||
..()
|
||||
switch(stage)
|
||||
if(2) //also changes say, see say.dm
|
||||
if(prob(5))
|
||||
to_chat(affected_mob, "<span class='notice'>You itch.</span>")
|
||||
affected_mob.emote("cough")
|
||||
if(3)
|
||||
if(prob(10))
|
||||
to_chat(affected_mob, "<span class='notice'>You hear faint barking.</span>")
|
||||
if(prob(5))
|
||||
to_chat(affected_mob, "<span class='notice'>You crave meat.</span>")
|
||||
affected_mob.emote("cough")
|
||||
if(prob(2))
|
||||
to_chat(affected_mob, "<span class='danger'>Your stomach growls!</span>")
|
||||
if(4)
|
||||
if(prob(10))
|
||||
to_chat(affected_mob, "<span class='danger'>Your stomach barks?!</span>")
|
||||
if(prob(5))
|
||||
affected_mob.visible_message("<span class='danger'>[affected_mob] howls!</span>", \
|
||||
"<span class='userdanger'>You howl!</span>")
|
||||
affected_mob.AdjustConfused(rand(6, 8))
|
||||
if(prob(3))
|
||||
var/list/puppytype = list(/mob/living/simple_animal/pet/corgi/puppy, /mob/living/simple_animal/pet/pug, /mob/living/simple_animal/pet/fox)
|
||||
var/mob/living/puppypicked = pick(puppytype)
|
||||
affected_mob.visible_message("<span class='danger'>[affected_mob] coughs up [initial(puppypicked.name)]!</span>", \
|
||||
"<span class='userdanger'>You cough up [initial(puppypicked.name)]?!</span>")
|
||||
affected_mob.emote("cough")
|
||||
affected_mob.adjustBruteLoss(5)
|
||||
new puppypicked(affected_mob.loc)
|
||||
new puppypicked(affected_mob.loc)
|
||||
return
|
||||
@@ -26,3 +26,38 @@
|
||||
if(4)
|
||||
if(prob(5))
|
||||
affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) )
|
||||
|
||||
|
||||
/datum/disease/pierrot_throat/advanced
|
||||
name = "Advanced Pierrot's Throat"
|
||||
spread_text = "Airborne"
|
||||
cure_text = "Banana products, especially banana bread."
|
||||
cures = list("banana")
|
||||
cure_chance = 75
|
||||
agent = "H0NI<42.B4n4 Virus"
|
||||
viable_mobtypes = list(/mob/living/carbon/human)
|
||||
permeability_mod = 0.75
|
||||
desc = "If left untreated the subject will probably drive others to insanity and go insane themselves."
|
||||
severity = DANGEROUS
|
||||
|
||||
/datum/disease/pierrot_throat/advanced/stage_act()
|
||||
..()
|
||||
switch(stage)
|
||||
if(1)
|
||||
if(prob(10))
|
||||
to_chat(affected_mob, "<span class='danger'>You feel very silly.</span>")
|
||||
if(prob(5))
|
||||
to_chat(affected_mob, "<span class='danger'>You feel like making a joke.</span>")
|
||||
if(2)
|
||||
if(prob(10))
|
||||
to_chat(affected_mob, "<span class='danger'>You don't just start seeing rainbows... YOU ARE RAINBOWS!</span>")
|
||||
if(3)
|
||||
if(prob(10))
|
||||
to_chat(affected_mob, "<span class='danger'>Your thoughts are interrupted by a loud <b>HONK!</b></span>")
|
||||
affected_mob << 'sound/items/AirHorn.ogg'
|
||||
if(4)
|
||||
if(prob(5))
|
||||
affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) )
|
||||
|
||||
if(!istype(affected_mob.wear_mask, /obj/item/clothing/mask/gas/virusclown_hat))
|
||||
affected_mob.equip_to_slot(new /obj/item/clothing/mask/gas/virusclown_hat(src), slot_wear_mask)
|
||||
@@ -388,6 +388,15 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
containertype = /obj/structure/closet/crate/secure/plasma
|
||||
containername = "energy gun crate"
|
||||
|
||||
/datum/supply_packs/security/armory/epistol // costs 3/5ths of the normal e-guns for 3/4ths the total ammo, making it cheaper to arm more people, but less convient for any one person
|
||||
name = "Energy Pistol Crate"
|
||||
contains = list(/obj/item/weapon/gun/energy/gun/mini,
|
||||
/obj/item/weapon/gun/energy/gun/mini,
|
||||
/obj/item/weapon/gun/energy/gun/mini)
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate/secure/plasma
|
||||
containername = "energy gun crate"
|
||||
|
||||
/datum/supply_packs/security/armory/eweapons
|
||||
name = "Incendiary Weapons Crate"
|
||||
contains = list(/obj/item/weapon/flamethrower/full,
|
||||
|
||||
@@ -53,15 +53,15 @@
|
||||
return cameras
|
||||
|
||||
|
||||
/area/proc/atmosalert(danger_level, var/alarm_source)
|
||||
/area/proc/atmosalert(danger_level, var/alarm_source, var/force = FALSE)
|
||||
if(danger_level == ATMOS_ALARM_NONE)
|
||||
atmosphere_alarm.clearAlarm(src, alarm_source)
|
||||
else
|
||||
atmosphere_alarm.triggerAlarm(src, alarm_source, severity = danger_level)
|
||||
|
||||
//Check all the alarms before lowering atmosalm. Raising is perfectly fine.
|
||||
//Check all the alarms before lowering atmosalm. Raising is perfectly fine. If force = 1 we don't care.
|
||||
for(var/obj/machinery/alarm/AA in src)
|
||||
if(!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted && AA.report_danger_level)
|
||||
if(!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted && AA.report_danger_level && !force)
|
||||
danger_level = max(danger_level, AA.danger_level)
|
||||
|
||||
if(danger_level != atmosalm)
|
||||
|
||||
@@ -281,10 +281,11 @@
|
||||
|
||||
// Get a list of all the people who want to be the antagonist for this round, except those with incompatible species
|
||||
for(var/mob/new_player/player in players)
|
||||
if((role in player.client.prefs.be_special) && !(player.client.prefs.species in protected_species))
|
||||
player_draft_log += "[player.key] had [roletext] enabled, so we are drafting them."
|
||||
candidates += player.mind
|
||||
players -= player
|
||||
if(!player.skip_antag)
|
||||
if((role in player.client.prefs.be_special) && !(player.client.prefs.species in protected_species))
|
||||
player_draft_log += "[player.key] had [roletext] enabled, so we are drafting them."
|
||||
candidates += player.mind
|
||||
players -= player
|
||||
|
||||
// If we don't have enough antags, draft people who voted for the round.
|
||||
if(candidates.len < recommended_enemies)
|
||||
|
||||
@@ -922,7 +922,7 @@
|
||||
return 1
|
||||
|
||||
if(href_list["atmos_reset"])
|
||||
if(alarm_area.atmosalert(ATMOS_ALARM_NONE, src))
|
||||
if(alarm_area.atmosalert(ATMOS_ALARM_NONE, src, TRUE))
|
||||
apply_danger_level(ATMOS_ALARM_NONE)
|
||||
alarmActivated = 0
|
||||
update_icon()
|
||||
|
||||
@@ -100,7 +100,10 @@
|
||||
if(drownee.losebreath > 20) //You've probably got bigger problems than drowning at this point, so we won't add to it until you get that under control.
|
||||
return
|
||||
|
||||
add_logs(src, drownee, "drowned", null, null, 0) //log it to their VV, but don't spam the admins' chats with the logs
|
||||
if(isLivingSSD(drownee))
|
||||
add_logs(src, drownee, "drowned", null, null, 0, 1) // Notify admins, since the person is SSD
|
||||
else
|
||||
add_logs(src, drownee, "drowned", null, null, 0, 0) // Do not notify admins.
|
||||
if(drownee.stat) //Mob is in critical.
|
||||
drownee.AdjustLoseBreath(3, bound_lower = 0, bound_upper = 20)
|
||||
drownee.visible_message("<span class='danger'>\The [drownee] appears to be drowning!</span>","<span class='userdanger'>You're quickly drowning!</span>") //inform them that they are fucked.
|
||||
|
||||
@@ -187,16 +187,16 @@ RCD
|
||||
if(!proximity) return
|
||||
if(istype(A,/area/shuttle)||istype(A,/turf/space/transit))
|
||||
return 0
|
||||
if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/window)))
|
||||
if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/window) || istype(A, /obj/structure/lattice)))
|
||||
return 0
|
||||
|
||||
switch(mode)
|
||||
if(1)
|
||||
if(istype(A, /turf/space))
|
||||
if(istype(A, /turf/space) || istype(A, /obj/structure/lattice))
|
||||
if(useResource(1, user))
|
||||
to_chat(user, "Building Floor...")
|
||||
activate()
|
||||
var/turf/AT = A
|
||||
var/turf/AT = get_turf(A)
|
||||
AT.ChangeTurf(/turf/simulated/floor/plating)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -111,23 +111,23 @@
|
||||
payload_name = "lubricant"
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
|
||||
B1.reagents.add_reagent("lube",50)
|
||||
beakers += B1
|
||||
/obj/item/weapon/grenade/chem_grenade/lube/remote
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/signaler)
|
||||
/obj/item/weapon/grenade/chem_grenade/lube/prox
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor)
|
||||
/obj/item/weapon/grenade/chem_grenade/lube/tripwire
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/infra)
|
||||
/obj/item/weapon/grenade/chem_grenade/lube/New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
|
||||
B1.reagents.add_reagent("lube",50)
|
||||
beakers += B1
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/lube/remote/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/signaler)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/lube/prox/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/lube/tripwire/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/infra)
|
||||
|
||||
|
||||
// Basic explosion grenade
|
||||
@@ -135,32 +135,68 @@
|
||||
payload_name = "conventional"
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B1.reagents.add_reagent("glycerol",30) // todo: someone says NG is overpowered, test.
|
||||
B1.reagents.add_reagent("sacid",15)
|
||||
B2.reagents.add_reagent("sacid",15)
|
||||
B2.reagents.add_reagent("facid",30)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
/obj/item/weapon/grenade/chem_grenade/explosion/New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B1.reagents.add_reagent("glycerol",30) // todo: someone says NG is overpowered, test.
|
||||
B1.reagents.add_reagent("sacid",15)
|
||||
B2.reagents.add_reagent("sacid",15)
|
||||
B2.reagents.add_reagent("facid",30)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
// Assembly Variants
|
||||
/obj/item/weapon/grenade/chem_grenade/explosion/remote
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/signaler)
|
||||
/obj/item/weapon/grenade/chem_grenade/explosion/remote/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/signaler)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/explosion/prox/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/explosion/mine/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/mousetrap)
|
||||
|
||||
|
||||
// Water + Potassium = Boom
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/waterpotassium
|
||||
payload_name = "chem explosive"
|
||||
stage = 2
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/waterpotassium/New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
B1.reagents.add_reagent("water",100)
|
||||
B2.reagents.add_reagent("potassium",100)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/waterpotassium/remote/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/signaler)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/waterpotassium/prox/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor)
|
||||
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/waterpotassium/tripwire/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/infra)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/waterpotassium/tripwire_armed/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/infra/armed)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/waterpotassium/tripwire_armed_stealth/New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/infra/armed/stealth)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/explosion/prox
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/explosion/mine
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/mousetrap)
|
||||
|
||||
// Basic EMP grenade
|
||||
/obj/item/weapon/grenade/chem_grenade/emp
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
new /obj/item/weapon/storage/box/ids(src)
|
||||
new /obj/item/weapon/storage/box/PDAs(src)
|
||||
new /obj/item/clothing/suit/armor/vest(src)
|
||||
new /obj/item/weapon/gun/energy/gun(src)
|
||||
new /obj/item/weapon/gun/energy/gun/mini(src)
|
||||
new /obj/item/device/flash(src)
|
||||
new /obj/item/clothing/accessory/petcollar(src)
|
||||
new /obj/item/weapon/door_remote/civillian(src)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
hub = "Exadv1.spacestation13"
|
||||
hub_password = "kMZy3U5jJHSiBQjr"
|
||||
name = "Space Station 13"
|
||||
/var/hub_password_base = "kMZy3U5jJHSiBQjr"
|
||||
/* This is for any host that would like their server to appear on the main SS13 hub.
|
||||
To use it, simply replace the password above, with the password found below, and it should work.
|
||||
If not, let us know on the main tgstation IRC channel of irc.rizon.net #tgstation13 we can help you there.
|
||||
|
||||
@@ -7,12 +7,16 @@
|
||||
|
||||
bomb_name = "tripwire mine"
|
||||
|
||||
secured = 0 // toggle_secure()'ed in New() for correct adding to processing_objects, won't work otherwise
|
||||
dir = EAST
|
||||
var/on = 0
|
||||
var/visible = 0
|
||||
var/visible = 1
|
||||
var/obj/effect/beam/i_beam/first = null
|
||||
var/obj/effect/beam/i_beam/last = null
|
||||
var/max_nesting_level = 10
|
||||
var/turf/fire_location
|
||||
var/emission_cycles = 0
|
||||
var/emission_cap = 20
|
||||
|
||||
/obj/item/device/assembly/infra/Destroy()
|
||||
if(first)
|
||||
@@ -22,7 +26,11 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/device/assembly/infra/describe()
|
||||
return "The infrared trigger is [on?"on":"off"]."
|
||||
return "The assembly is [secured ? "secure" : "not secure"]. The infrared trigger is [on ? "on" : "off"]."
|
||||
|
||||
/obj/item/device/assembly/infra/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, describe())
|
||||
|
||||
/obj/item/device/assembly/infra/activate()
|
||||
if(!..()) return 0//Cooldown check
|
||||
@@ -36,11 +44,22 @@
|
||||
processing_objects.Add(src)
|
||||
else
|
||||
on = 0
|
||||
if(first) qdel(first)
|
||||
if(first)
|
||||
qdel(first)
|
||||
processing_objects.Remove(src)
|
||||
update_icon()
|
||||
return secured
|
||||
|
||||
/obj/item/device/assembly/infra/New()
|
||||
..()
|
||||
if(!secured)
|
||||
toggle_secure()
|
||||
|
||||
/obj/item/device/assembly/infra/proc/arm() // Forces the device to arm no matter its current state.
|
||||
if(!secured) // Checked because arm() might be called sometime after the object is spawned.
|
||||
toggle_secure()
|
||||
on = 1
|
||||
|
||||
/obj/item/device/assembly/infra/update_icon()
|
||||
overlays.Cut()
|
||||
attached_overlays = list()
|
||||
@@ -51,38 +70,22 @@
|
||||
if(holder)
|
||||
holder.update_icon()
|
||||
|
||||
/obj/item/device/assembly/infra/proc/get_valid_loc(atom/A, atom/prev, level = 0)
|
||||
if(!A)
|
||||
A = loc
|
||||
if(!prev)
|
||||
prev = src
|
||||
if(level > max_nesting_level)
|
||||
return null
|
||||
else if(isturf(A))
|
||||
return A
|
||||
else if(isobj(A))
|
||||
var/obj/O = A
|
||||
if(isassembly(A) || O.IsAssemblyHolder() || istype(A, /obj/item/device/onetankbomb))
|
||||
return .(A.loc, A, level + 1)
|
||||
else if(ismob(A))
|
||||
var/mob/user = A
|
||||
if(user.get_active_hand() == prev || user.get_inactive_hand() == prev)
|
||||
return .(A.loc, A, level + 1)
|
||||
return null
|
||||
|
||||
/obj/item/device/assembly/infra/process()
|
||||
if(!on || fire_location != get_turf(loc))
|
||||
if(first)
|
||||
qdel(first)
|
||||
return
|
||||
var/turf/T = get_turf(src)
|
||||
if(first && (!on || !fire_location || fire_location != T || emission_cycles >= emission_cap))
|
||||
qdel(first)
|
||||
return
|
||||
if(!on)
|
||||
return
|
||||
if(!secured)
|
||||
return
|
||||
if(first && last)
|
||||
last.process()
|
||||
emission_cycles++
|
||||
return
|
||||
var/turf/T = get_valid_loc()
|
||||
if(T)
|
||||
fire_location = T
|
||||
emission_cycles = 0
|
||||
var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(T)
|
||||
I.master = src
|
||||
I.density = 1
|
||||
@@ -124,6 +127,8 @@
|
||||
return 0
|
||||
pulse(0)
|
||||
audible_message("[bicon(src)] *beep* *beep*", null, 3)
|
||||
if(first)
|
||||
qdel(first)
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
@@ -177,6 +182,21 @@
|
||||
if(usr.machine == src)
|
||||
interact(usr)
|
||||
|
||||
if(first)
|
||||
qdel(first)
|
||||
|
||||
|
||||
|
||||
/obj/item/device/assembly/infra/armed/New()
|
||||
..()
|
||||
spawn(3)
|
||||
if(holder)
|
||||
if(holder.master)
|
||||
dir = holder.master.dir
|
||||
arm()
|
||||
|
||||
/obj/item/device/assembly/infra/armed/stealth
|
||||
visible = 0
|
||||
|
||||
|
||||
/***************************IBeam*********************************/
|
||||
@@ -191,6 +211,8 @@
|
||||
var/limit = null
|
||||
var/visible = 0.0
|
||||
var/left = null
|
||||
var/life_cycles = 0
|
||||
var/life_cap = 20
|
||||
anchored = 1.0
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
|
||||
@@ -209,7 +231,8 @@
|
||||
transform = turn(matrix(), dir2angle(dir))
|
||||
|
||||
/obj/effect/beam/i_beam/process()
|
||||
if((loc.density || !(master)))
|
||||
life_cycles++
|
||||
if(loc.density || !master || life_cycles >= life_cap)
|
||||
qdel(src)
|
||||
return
|
||||
if(left > 0)
|
||||
|
||||
@@ -131,6 +131,7 @@
|
||||
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
|
||||
icon_state = "clown"
|
||||
item_state = "clown_hat"
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/clothing/mask/gas/sexyclown
|
||||
name = "sexy-clown wig and mask"
|
||||
|
||||
@@ -562,7 +562,7 @@
|
||||
|
||||
log_robot("[key_name(speaker)] : [message]")
|
||||
var/message_start = "<i><span class='game say'>[name], <span class='name'>[speaker.name]</span>"
|
||||
var/message_body = "<span class='message'>[speaker.say_quote(message)],</i> <span class='ibm'>\"[message]\"</span></span></span>"
|
||||
var/message_body = "<span class='message'>[speaker.say_quote(message)],</i><span class='robot'>\"[message]\"</span></span></span>"
|
||||
|
||||
for(var/mob/M in dead_mob_list)
|
||||
if(!isnewplayer(M) && !isbrain(M))
|
||||
|
||||
@@ -166,6 +166,9 @@
|
||||
set category = "Robot Commands"
|
||||
set name = "Power Warning"
|
||||
|
||||
if(handle_emote_CD(50))
|
||||
return
|
||||
|
||||
if(!is_component_functioning("power cell") || !cell || !cell.charge)
|
||||
visible_message("The power warning light on <span class='name'>[src]</span> flashes urgently.",\
|
||||
"You announce you are operating in low power mode.")
|
||||
|
||||
@@ -49,6 +49,8 @@ var/list/robot_verbs_default = list(
|
||||
var/datum/wires/robot/wires = null
|
||||
|
||||
var/opened = 0
|
||||
var/custom_panel = null
|
||||
var/list/custom_panel_names = list("Cricket")
|
||||
var/emagged = 0
|
||||
|
||||
var/list/force_modules = list()
|
||||
@@ -314,6 +316,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Default"] = "Service2"
|
||||
module_sprites["Standard"] = "robotServ"
|
||||
module_sprites["Noble-SRV"] = "Noble-SRV"
|
||||
module_sprites["Cricket"] = "Cricket-SERV"
|
||||
|
||||
if("Miner")
|
||||
module = new /obj/item/weapon/robot_module/miner(src)
|
||||
@@ -325,6 +328,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Treadhead"] = "Miner"
|
||||
module_sprites["Standard"] = "robotMine"
|
||||
module_sprites["Noble-DIG"] = "Noble-DIG"
|
||||
module_sprites["Cricket"] = "Cricket-MINE"
|
||||
|
||||
if("Medical")
|
||||
module = new /obj/item/weapon/robot_module/medical(src)
|
||||
@@ -337,6 +341,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Needles"] = "medicalrobot"
|
||||
module_sprites["Standard"] = "robotMedi"
|
||||
module_sprites["Noble-MED"] = "Noble-MED"
|
||||
module_sprites["Cricket"] = "Cricket-MEDI"
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
if("Security")
|
||||
@@ -348,6 +353,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Bloodhound"] = "bloodhound"
|
||||
module_sprites["Standard"] = "robotSecy"
|
||||
module_sprites["Noble-SEC"] = "Noble-SEC"
|
||||
module_sprites["Cricket"] = "Cricket-SEC"
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
if("Engineering")
|
||||
@@ -360,6 +366,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Landmate"] = "landmate"
|
||||
module_sprites["Standard"] = "robotEngi"
|
||||
module_sprites["Noble-ENG"] = "Noble-ENG"
|
||||
module_sprites["Cricket"] = "Cricket-ENGI"
|
||||
magpulse = 1
|
||||
|
||||
if("Janitor")
|
||||
@@ -370,6 +377,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Mop Gear Rex"] = "mopgearrex"
|
||||
module_sprites["Standard"] = "robotJani"
|
||||
module_sprites["Noble-CLN"] = "Noble-CLN"
|
||||
module_sprites["Cricket"] = "Cricket-JANI"
|
||||
|
||||
if("Combat")
|
||||
module = new /obj/item/weapon/robot_module/combat(src)
|
||||
@@ -968,6 +976,9 @@ var/list/robot_verbs_default = list(
|
||||
if(custom_sprite) //Custom borgs also have custom panels, heh
|
||||
panelprefix = "[ckey]"
|
||||
|
||||
if(custom_panel in custom_panel_names) //For default borgs with different panels
|
||||
panelprefix = custom_panel
|
||||
|
||||
if(wiresexposed)
|
||||
overlays += "[panelprefix]-openpanel +w"
|
||||
else if(cell)
|
||||
@@ -1289,6 +1300,8 @@ var/list/robot_verbs_default = list(
|
||||
module.module_type = "Brobot"
|
||||
update_module_icon()
|
||||
lockcharge = null
|
||||
var/list/names = splittext(icontype, "-")
|
||||
custom_panel = trim(names[1])
|
||||
else
|
||||
to_chat(src, "Something is badly wrong with the sprite selection. Harass a coder.")
|
||||
icon_state = module_sprites[1]
|
||||
|
||||
@@ -175,3 +175,5 @@
|
||||
eats_mice = 0
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 15
|
||||
@@ -37,4 +37,6 @@
|
||||
faction = list("syndicate")
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
minbodytemp = 0
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 20
|
||||
@@ -17,8 +17,8 @@
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "kicks"
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
|
||||
melee_damage_lower = 18
|
||||
melee_damage_upper = 18
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
speed = 2
|
||||
@@ -28,4 +28,4 @@
|
||||
/mob/living/simple_animal/pet/sloth/paperwork
|
||||
name = "Paperwork"
|
||||
desc = "Cargo's pet sloth. About as useful as the rest of the techs."
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
|
||||
@@ -687,7 +687,15 @@
|
||||
"STOP HOT-WIRING THE ENGINE, FUCKING CHRIST!",
|
||||
"Wire the solars, you lazy bums!",
|
||||
"WHO TOOK THE DAMN HARDSUITS?",
|
||||
"OH GOD ITS FREE CALL THE SHUTTLE")
|
||||
"OH GOD ITS FREE CALL THE SHUTTLE",
|
||||
"Why are there so many atmos alerts?",
|
||||
"OH GOD WHY WOULD YOU TURN ON THE PA BEFORE CONTAINMENT IS UP?",
|
||||
"Remember to lock the emitters!",
|
||||
"Stop goofing off and repair the goddam station!",
|
||||
"The singularity is not your friend!",
|
||||
"What were the wires again?",
|
||||
"Goddam emaggers!"
|
||||
)
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
|
||||
|
||||
/mob/living/simple_animal/parrot/Poly/New()
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/mob/new_player
|
||||
var/ready = 0
|
||||
var/spawning = 0//Referenced when you want to delete the new_player later on in the code.
|
||||
var/skip_antag = 0 //For declining an antag roll this round.
|
||||
var/spawning = 0 //Referenced when you want to delete the new_player later on in the code.
|
||||
var/totalPlayers = 0 //Player counts for the Lobby tab
|
||||
var/totalPlayersReady = 0
|
||||
universal_speak = 1
|
||||
@@ -31,6 +32,11 @@
|
||||
if(!ready) output += "<p><a href='byond://?src=[UID()];ready=1'>Declare Ready</A></p>"
|
||||
else output += "<p><b>You are ready</b> (<a href='byond://?src=[UID()];ready=2'>Cancel</A>)</p>"
|
||||
|
||||
var/list/antags = client.prefs.be_special
|
||||
if(antags && antags.len)
|
||||
if(!skip_antag) output += "<p><a href='byond://?src=[UID()];skip_antag=1'>Global Antag Candidancy</A>"
|
||||
else output += "<p><a href='byond://?src=[UID()];skip_antag=2'>Global Antag Candidancy</A>"
|
||||
output += "<br /><small>You are <b>[skip_antag ? "ineligable" : "eligable"]</b> for all antag roles.</small></p>"
|
||||
else
|
||||
output += "<p><a href='byond://?src=[UID()];manifest=1'>View the Crew Manifest</A></p>"
|
||||
output += "<p><a href='byond://?src=[UID()];late_join=1'>Join Game!</A></p>"
|
||||
@@ -111,6 +117,10 @@
|
||||
ready = !ready
|
||||
new_player_panel_proc()
|
||||
|
||||
if(href_list["skip_antag"])
|
||||
skip_antag = !skip_antag
|
||||
new_player_panel_proc()
|
||||
|
||||
if(href_list["refresh"])
|
||||
src << browse(null, "window=playersetup") //closes the player setup window
|
||||
new_player_panel_proc()
|
||||
|
||||
@@ -274,6 +274,9 @@
|
||||
if(!MP)
|
||||
return 0
|
||||
|
||||
if(!GAMEMODE_IS_NUCLEAR)
|
||||
if(ispath(MP, /mob/living/simple_animal/pet/cat/Syndi))
|
||||
return 0
|
||||
if(ispath(MP, /mob/living/simple_animal/pet/cat))
|
||||
return 1
|
||||
if(ispath(MP, /mob/living/simple_animal/pet/corgi))
|
||||
@@ -288,6 +291,9 @@
|
||||
return 1
|
||||
if(ispath(MP, /mob/living/simple_animal/pony))
|
||||
return 1
|
||||
if(!GAMEMODE_IS_NUCLEAR)
|
||||
if(ispath(MP, /mob/living/simple_animal/pet/fox/Syndifox))
|
||||
return 0
|
||||
if(ispath(MP, /mob/living/simple_animal/pet/fox))
|
||||
return 1
|
||||
if(ispath(MP, /mob/living/simple_animal/chick))
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
name = "miniature energy gun"
|
||||
desc = "A small, pistol-sized energy gun with a built-in flashlight. It has two settings: stun and kill."
|
||||
icon_state = "mini"
|
||||
item_state = "gun"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
ammo_x_offset = 2
|
||||
charge_sections = 3
|
||||
|
||||
@@ -896,7 +896,7 @@
|
||||
/datum/design/mech_disabler
|
||||
name = "Exosuit Weapon (CH-PD Disabler)"
|
||||
desc = "Allows for the construction of CH-PD Disabler."
|
||||
id = "mech_laser"
|
||||
id = "mech_disabler"
|
||||
build_type = MECHFAB
|
||||
req_tech = list("combat" = 3)
|
||||
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/disabler
|
||||
|
||||
@@ -27,6 +27,10 @@
|
||||
|
||||
//Will not be announced if you try to set to the same level as it already is
|
||||
if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != security_level)
|
||||
if(level >= SEC_LEVEL_RED && security_level < SEC_LEVEL_RED)
|
||||
// Mark down this time to prevent shuttle cheese
|
||||
shuttle_master.emergency_sec_level_time = world.time
|
||||
|
||||
switch(level)
|
||||
if(SEC_LEVEL_GREEN)
|
||||
security_announcement_down.Announce("All threats to the station have passed. All weapons need to be holstered and privacy laws are once again fully enforced.","Attention! Security level lowered to green.")
|
||||
|
||||
+17
-2
@@ -60,8 +60,8 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG
|
||||
map_name = "[using_map.name]"
|
||||
else
|
||||
map_name = "Unknown"
|
||||
|
||||
|
||||
|
||||
|
||||
if(config && config.server_name)
|
||||
name = "[config.server_name]: [station_name()]"
|
||||
else
|
||||
@@ -118,6 +118,9 @@ var/world_topic_spam_protect_time = world.timeofday
|
||||
s["players"] = list()
|
||||
s["roundtime"] = worldtime2text()
|
||||
s["stationtime"] = station_time_timestamp()
|
||||
s["listed"] = "Public"
|
||||
if(!hub_password)
|
||||
s["listed"] = "Invisible"
|
||||
var/player_count = 0
|
||||
var/admin_count = 0
|
||||
|
||||
@@ -270,6 +273,18 @@ var/world_topic_spam_protect_time = world.timeofday
|
||||
|
||||
return "Logs set to current date"
|
||||
|
||||
else if("setlist" in input)
|
||||
if(!key_valid)
|
||||
return keySpamProtect(addr)
|
||||
if(input["req"] == "public")
|
||||
hub_password = hub_password_base
|
||||
update_status()
|
||||
return "Set listed status to public."
|
||||
else
|
||||
hub_password = ""
|
||||
update_status()
|
||||
return "Set listed status to invisible."
|
||||
|
||||
/proc/keySpamProtect(var/addr)
|
||||
if(world_topic_spam_protect_ip == addr && abs(world_topic_spam_protect_time - world.time) < 50)
|
||||
spawn(50)
|
||||
|
||||
Reference in New Issue
Block a user