Merge branch 'master' into stationgoals

This commit is contained in:
Mark van Alphen
2017-02-17 18:05:15 +01:00
committed by GitHub
214 changed files with 3728 additions and 1602 deletions
+3 -7
View File
@@ -139,6 +139,7 @@
/mob/living/carbon/proc/med_hud_set_status()
var/image/holder = hud_list[STATUS_HUD]
//var/image/holder2 = hud_list[STATUS_HUD_OOC]
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(stat == 2)
holder.icon_state = "huddead"
//holder2.icon_state = "huddead"
@@ -146,13 +147,8 @@
holder.icon_state = "hudxeno"
else if(check_virus())
holder.icon_state = "hudill"
else if(has_brain_worms())
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(B.controlling)
holder.icon_state = "hudbrainworm"
else
holder.icon_state = "hudhealthy"
//holder2.icon_state = "hudhealthy"
else if(has_brain_worms() && B != null && B.controlling)
holder.icon_state = "hudbrainworm"
else
holder.icon_state = "hudhealthy"
//holder2.icon_state = "hudhealthy"
+5 -5
View File
@@ -135,13 +135,13 @@
message = replacetextEx(message,"w","v")
message = replacetextEx(message,"J","Y")
message = replacetextEx(message,"j","y")
message = replacetextEx(message,"A",pick("Å","Ä","Æ","A"))
message = replacetextEx(message,"a",pick("å","ä","æ","a"))
message = replacetextEx(message,"A",pick("Å","Ä","Æ","A"))
message = replacetextEx(message,"a",pick("å","ä","æ","a"))
message = replacetextEx(message,"BO","BJO")
message = replacetextEx(message,"Bo","Bjo")
message = replacetextEx(message,"bo","bjo")
message = replacetextEx(message,"O",pick("Ö","Ø","O"))
message = replacetextEx(message,"o",pick("ö","ø","o"))
message = replacetextEx(message,"O",pick("Ö","Ø","O"))
message = replacetextEx(message,"o",pick("ö","ø","o"))
if(prob(30))
message += " Bork[pick("",", bork",", bork, bork")]!"
return message
@@ -259,7 +259,7 @@
action_icon_state = "genetic_incendiary"
/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets,mob/living/user = usr)
/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets, mob/living/user = usr)
var/mob/living/carbon/L = user
L.adjust_fire_stacks(0.5)
L.visible_message("<span class='danger'>[L.name]</b> suddenly bursts into flames!</span>")
+80 -88
View File
@@ -143,15 +143,15 @@
action_icon_state = "genetic_cryo"
/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets)
/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets, mob/user = usr)
if(!targets.len)
to_chat(usr, "<span class='notice'>No target found in range.</span>")
to_chat(user, "<span class='notice'>No target found in range.</span>")
return
var/mob/living/carbon/C = targets[1]
if(!iscarbon(C))
to_chat(usr, "<span class='warning'>This will only work on normal organic beings.</span>")
to_chat(user, "<span class='warning'>This will only work on normal organic beings.</span>")
return
if(RESIST_COLD in C.mutations)
@@ -164,15 +164,15 @@
if(istype(H.wear_suit, /obj/item/clothing/suit/space))
handle_suit = 1
if(H.internal)
H.visible_message("<span class='warning'>[usr] sprays a cloud of fine ice crystals, engulfing [H]!</span>",
"<span class='notice'>[usr] sprays a cloud of fine ice crystals over your [H.head]'s visor.</span>")
log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] while wearing internals and a suit")
msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]")
H.visible_message("<span class='warning'>[user] sprays a cloud of fine ice crystals, engulfing [H]!</span>",
"<span class='notice'>[user] sprays a cloud of fine ice crystals over your [H.head]'s visor.</span>")
log_admin("[key_name(user)] has used cryokinesis on [key_name(C)] while wearing internals and a suit")
msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]")
else
H.visible_message("<span class='warning'>[usr] sprays a cloud of fine ice crystals engulfing, [H]!</span>",
"<span class='warning'>[usr] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.</span>")
log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)]")
msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]")
H.visible_message("<span class='warning'>[user] sprays a cloud of fine ice crystals engulfing, [H]!</span>",
"<span class='warning'>[user] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.</span>")
log_admin("[key_name(user)] has used cryokinesis on [key_name(C)]")
msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]")
H.bodytemperature = max(0, H.bodytemperature - 50)
H.adjustFireLoss(5)
if(!handle_suit)
@@ -180,11 +180,11 @@
C.adjustFireLoss(10)
C.ExtinguishMob()
C.visible_message("\red [usr] sprays a cloud of fine ice crystals, engulfing [C]!")
log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] without internals or a suit")
msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]")
C.visible_message("\red [user] sprays a cloud of fine ice crystals, engulfing [C]!")
log_admin("[key_name(user)] has used cryokinesis on [key_name(C)] without internals or a suit")
msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]")
//playsound(usr.loc, 'bamf.ogg', 50, 0)
//playsound(user.loc, 'bamf.ogg', 50, 0)
new/obj/effect/self_deleting(C.loc, icon('icons/effects/genetics.dmi', "cryokinesis"))
@@ -294,10 +294,9 @@
revert_cast(user)
return
perform(targets)
perform(targets, user = user)
/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets)
var/mob/user = usr
/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets, mob/user = usr)
if(!targets.len)
to_chat(user, "<span class='notice'>No target found in range.</span>")
return
@@ -383,60 +382,60 @@
action_icon_state = "genetic_jump"
/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets)
/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets, mob/user = usr)
var/failure = 0
if(istype(usr.loc,/mob/) || usr.lying || usr.stunned || usr.buckled || usr.stat)
to_chat(usr, "<span class='warning'>You can't jump right now!</span>")
if(istype(user.loc,/mob/) || user.lying || user.stunned || user.buckled || user.stat)
to_chat(user, "<span class='warning'>You can't jump right now!</span>")
return
if(istype(usr.loc,/turf/))
if(usr.restrained())//Why being pulled while cuffed prevents you from moving
for(var/mob/M in range(usr, 1))
if(M.pulling == usr)
if(!M.restrained() && M.stat == 0 && M.canmove && usr.Adjacent(M))
if(istype(user.loc,/turf/))
if(user.restrained())//Why being pulled while cuffed prevents you from moving
for(var/mob/M in range(user, 1))
if(M.pulling == user)
if(!M.restrained() && M.stat == 0 && M.canmove && user.Adjacent(M))
failure = 1
else
M.stop_pulling()
if(usr.pinned.len)
if(user.pinned.len)
failure = 1
usr.visible_message("<span class='danger'>[usr.name]</b> takes a huge leap!</span>")
playsound(usr.loc, 'sound/weapons/thudswoosh.ogg', 50, 1)
user.visible_message("<span class='danger'>[user.name]</b> takes a huge leap!</span>")
playsound(user.loc, 'sound/weapons/thudswoosh.ogg', 50, 1)
if(failure)
usr.Weaken(5)
usr.Stun(5)
usr.visible_message("<span class='warning'>[usr] attempts to leap away but is slammed back down to the ground!</span>",
user.Weaken(5)
user.Stun(5)
user.visible_message("<span class='warning'>[user] attempts to leap away but is slammed back down to the ground!</span>",
"<span class='warning'>You attempt to leap away but are suddenly slammed back down to the ground!</span>",
"<span class='notice'>You hear the flexing of powerful muscles and suddenly a crash as a body hits the floor.</span>")
return 0
var/prevLayer = usr.layer
var/prevFlying = usr.flying
usr.layer = 9
var/prevLayer = user.layer
var/prevFlying = user.flying
user.layer = 9
usr.flying = 1
user.flying = 1
for(var/i=0, i<10, i++)
step(usr, usr.dir)
if(i < 5) usr.pixel_y += 8
else usr.pixel_y -= 8
step(user, user.dir)
if(i < 5) user.pixel_y += 8
else user.pixel_y -= 8
sleep(1)
usr.flying = prevFlying
user.flying = prevFlying
if(FAT in usr.mutations && prob(66))
usr.visible_message("<span class='danger'>[usr.name]</b> crashes due to their heavy weight!</span>")
//playsound(usr.loc, 'zhit.wav', 50, 1)
usr.AdjustWeakened(10)
usr.AdjustStunned(5)
if(FAT in user.mutations && prob(66))
user.visible_message("<span class='danger'>[user.name]</b> crashes due to their heavy weight!</span>")
//playsound(user.loc, 'zhit.wav', 50, 1)
user.AdjustWeakened(10)
user.AdjustStunned(5)
usr.layer = prevLayer
user.layer = prevLayer
if(istype(usr.loc,/obj/))
var/obj/container = usr.loc
to_chat(usr, "<span class='warning'>You leap and slam your head against the inside of [container]! Ouch!</span>")
usr.AdjustParalysis(3)
usr.AdjustWeakened(5)
container.visible_message("<span class='danger'>[usr.loc]</b> emits a loud thump and rattles a bit.</span>")
playsound(usr.loc, 'sound/effects/bang.ogg', 50, 1)
if(istype(user.loc,/obj/))
var/obj/container = user.loc
to_chat(user, "<span class='warning'>You leap and slam your head against the inside of [container]! Ouch!</span>")
user.AdjustParalysis(3)
user.AdjustWeakened(5)
container.visible_message("<span class='danger'>[user.loc]</b> emits a loud thump and rattles a bit.</span>")
playsound(user.loc, 'sound/effects/bang.ogg', 50, 1)
var/wiggle = 6
while(wiggle > 0)
wiggle--
@@ -446,9 +445,6 @@
container.pixel_x = 0
container.pixel_y = 0
return
////////////////////////////////////////////////////////////////////////
// WAS: /datum/bioEffect/polymorphism
@@ -475,6 +471,7 @@
charge_max = 1800
clothes_req = 0
human_req = 1
stat_allowed = 0
invocation_type = "none"
range = 1
@@ -482,21 +479,18 @@
action_icon_state = "genetic_poly"
/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets)
var/mob/living/M=targets[1]
/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets, mob/user = usr)
var/mob/living/M = targets[1]
if(!ishuman(M))
to_chat(usr, "<span class='warning'>You can only change your appearance to that of another human.</span>")
return
if(!ishuman(usr))
return
usr.visible_message("<span class='warning'>[usr]'s body shifts and contorts.</span>")
user.visible_message("<span class='warning'>[user]'s body shifts and contorts.</span>")
spawn(10)
if(M && usr)
playsound(usr.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
var/mob/living/carbon/human/H = usr
if(M && user)
playsound(user.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
var/mob/living/carbon/human/H = user
var/mob/living/carbon/human/target = M
H.UpdateAppearance(target.dna.UI)
H.real_name = target.real_name
@@ -524,6 +518,7 @@
desc = "Read the minds of others for information."
charge_max = 180
clothes_req = 0
human_req = 1
stat_allowed = 0
invocation_type = "none"
range = -2
@@ -539,29 +534,26 @@
revert_cast(user)
return
perform(targets)
/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets)
if(!ishuman(usr)) return
perform(targets, user = user)
/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets, mob/user = usr)
for(var/mob/living/carbon/M in targets)
if(!iscarbon(M))
to_chat(usr, "<span class='warning'>You may only use this on other organic beings.</span>")
to_chat(user, "<span class='warning'>You may only use this on other organic beings.</span>")
return
if(PSY_RESIST in M.mutations)
to_chat(usr, "<span class='warning'>You can't see into [M.name]'s mind at all!</span>")
to_chat(user, "<span class='warning'>You can't see into [M.name]'s mind at all!</span>")
return
if(M.stat == 2)
to_chat(usr, "<span class='warning'>[M.name] is dead and cannot have their mind read.</span>")
to_chat(user, "<span class='warning'>[M.name] is dead and cannot have their mind read.</span>")
return
if(M.health < 0)
to_chat(usr, "<span class='warning'>[M.name] is dying, and their thoughts are too scrambled to read.</span>")
to_chat(user, "<span class='warning'>[M.name] is dying, and their thoughts are too scrambled to read.</span>")
return
to_chat(usr, "<span class='notice'>Mind Reading of <b>[M.name]:</b></span>")
to_chat(user, "<span class='notice'>Mind Reading of <b>[M.name]:</b></span>")
var/pain_condition = M.health
// lower health means more pain
var/list/randomthoughts = list("what to have for lunch","the future","the past","money",
@@ -578,33 +570,33 @@
switch(pain_condition)
if(81 to INFINITY)
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] feels good.</span>")
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] feels good.</span>")
if(61 to 80)
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] is suffering mild pain.</span>")
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering mild pain.</span>")
if(41 to 60)
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] is suffering significant pain.</span>")
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering significant pain.</span>")
if(21 to 40)
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] is suffering severe pain.</span>")
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering severe pain.</span>")
else
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] is suffering excruciating pain.</span>")
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering excruciating pain.</span>")
thoughts = "haunted by their own mortality"
switch(M.a_intent)
if(I_HELP)
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense benevolent thoughts from [M.name].</span>")
to_chat(user, "<span class='notice'><b>Mood</b>: You sense benevolent thoughts from [M.name].</span>")
if(I_DISARM)
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense cautious thoughts from [M.name].</span>")
to_chat(user, "<span class='notice'><b>Mood</b>: You sense cautious thoughts from [M.name].</span>")
if(I_GRAB)
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense hostile thoughts from [M.name].</span>")
to_chat(user, "<span class='notice'><b>Mood</b>: You sense hostile thoughts from [M.name].</span>")
if(I_HARM)
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense cruel thoughts from [M.name].</span>")
to_chat(user, "<span class='notice'><b>Mood</b>: You sense cruel thoughts from [M.name].</span>")
for(var/mob/living/L in view(7,M))
if(L == M)
continue
thoughts = "thinking about punching [L.name]"
break
else
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense strange thoughts from [M.name].</span>")
to_chat(user, "<span class='notice'><b>Mood</b>: You sense strange thoughts from [M.name].</span>")
if(istype(M,/mob/living/carbon/human))
var/numbers[0]
@@ -613,11 +605,11 @@
numbers += H.mind.initial_account.account_number
numbers += H.mind.initial_account.remote_access_pin
if(numbers.len>0)
to_chat(usr, "<span class='notice'><b>Numbers</b>: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].</span>")
to_chat(usr, "<span class='notice'><b>Thoughts</b>: [M.name] is currently [thoughts].</span>")
to_chat(user, "<span class='notice'><b>Numbers</b>: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].</span>")
to_chat(user, "<span class='notice'><b>Thoughts</b>: [M.name] is currently [thoughts].</span>")
if(EMPATH in M.mutations)
to_chat(M, "<span class='warning'>You sense [usr.name] reading your mind.</span>")
to_chat(M, "<span class='warning'>You sense [user.name] reading your mind.</span>")
else if(prob(5) || M.mind.assigned_role=="Chaplain")
to_chat(M, "<span class='warning'>You sense someone intruding upon your thoughts...</span>")
return
-2
View File
@@ -45,8 +45,6 @@
print_command_report(intercepttext, interceptname)
event_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg')
return
/datum/station_state
var/floor = 0
+1 -1
View File
@@ -333,7 +333,7 @@
if(ticker && ticker.mode.name == "blob")
var/datum/game_mode/blob/BL = ticker.mode
BL.blobwincount = initial(BL.blobwincount) * 2
BL.blobwincount += initial(BL.blobwincount)
/mob/camera/blob/verb/blob_broadcast()
@@ -11,6 +11,16 @@
to_chat(user, "<span class='notice'>We cleanse impurities from our form.</span>")
var/mob/living/simple_animal/borer/B = user.has_brain_worms()
if(B)
if(B.controlling)
B.detatch()
B.leave_host()
if(iscarbon(user))
var/mob/living/carbon/C = user
C.vomit(0)
to_chat(user, "<span class='notice'>We expel a parasite from our form.</span>")
var/obj/item/organ/internal/body_egg/egg = user.get_int_organ(/obj/item/organ/internal/body_egg)
if(egg)
egg.remove(user)
+1 -1
View File
@@ -245,7 +245,7 @@
var/timer = shuttle_master.emergency.timeLeft(1) + cursetime
shuttle_master.emergency.setTimer(timer)
to_chat(user,"<span class='danger'>You shatter the orb! A dark essence spirals into the air, then disappears.</span>")
playsound(user.loc, "sound/effects/Glassbr1.ogg", 50, 1)
playsound(user.loc, 'sound/effects/Glassbr1.ogg', 50, 1)
qdel(src)
sleep(20)
var/global/list/curses
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,51 @@
/datum/borer_chem
var/chemname
var/chemdesc = "This is a chemical"
var/chemuse = 30
var/quantity = 10
/datum/borer_chem/capulettium_plus
chemname = "capulettium_plus"
chemdesc = "Silences and masks pulse."
/datum/borer_chem/charcoal
chemname = "charcoal"
chemdesc = "Slowly heals toxin damage, also slowly removes other chemicals."
/datum/borer_chem/epinephrine
chemname = "epinephrine"
chemdesc = "Stabilizes critical condition and slowly heals suffocation damage."
/datum/borer_chem/fliptonium
chemname = "fliptonium"
chemdesc = "Causes uncontrollable flipping."
chemuse = 50
/datum/borer_chem/hydrocodone
chemname = "hydrocodone"
chemdesc = "An extremely strong painkiller."
/datum/borer_chem/mannitol
chemname = "mannitol"
chemdesc = "Heals brain damage."
/datum/borer_chem/methamphetamine
chemname = "methamphetamine"
chemdesc = "Reduces stun times and increases stamina. Deals small amounts of brain damage."
chemuse = 50
/datum/borer_chem/mitocholide
chemname = "mitocholide"
chemdesc = "Heals internal organ damage."
/datum/borer_chem/salbutamol
chemname = "salbutamol"
chemdesc = "Heals suffocation damage."
/datum/borer_chem/salglu_solution
chemname = "salglu_solution"
chemdesc = "Slowly heals brute and burn damage, also slowly restores blood."
/datum/borer_chem/spaceacillin
chemname = "spaceacillin"
chemdesc = "Slows progression of diseases and fights infections."
@@ -4,11 +4,11 @@
announceWhen = 400
var/spawncount = 5
var/successSpawn = 0 //So we don't make a command report if nothing gets spawned.
var/successSpawn = FALSE //So we don't make a command report if nothing gets spawned.
/datum/event/borer_infestation/setup()
announceWhen = rand(announceWhen, announceWhen + 50)
spawncount = rand(1, 3)
spawncount = rand(2, 3)
/datum/event/borer_infestation/announce()
if(successSpawn)
@@ -22,14 +22,8 @@
if(temp_vent.parent.other_atmosmch.len > 50)
vents += temp_vent
spawn(0)
var/list/candidates = pollCandidates("Do you want to play as a cortical borer?", ROLE_BORER, 1)
while(spawncount > 0 && vents.len && candidates.len)
var/obj/vent = pick_n_take(vents)
var/mob/C = pick_n_take(candidates)
var/mob/living/simple_animal/borer/new_borer = new(vent.loc)
new_borer.key = C.key
spawncount--
successSpawn = 1
while(spawncount >= 1 && vents.len)
var/obj/vent = pick_n_take(vents)
new /mob/living/simple_animal/borer(vent.loc)
successSpawn = TRUE
spawncount--
@@ -0,0 +1,69 @@
/mob/living/simple_animal/borer/proc/get_html_template(content)
var/html = {"<!DOCTYPE html">
<html>
<head>
<title>Borer Chemicals</title>
<link rel='stylesheet' type='text/css' href='icons.css'>
<link rel='stylesheet' type='text/css' href='shared.css'>
<style type='text/css'>
body {
font-size: 12px;
color: #ffffff;
font-family: Verdana, Geneva, sans-serif;
background: #272727;
overflow-x: hidden;
}
a, a:link, a:visited, a:active, .link, .linkOn, .linkOff, .selected, .disabled {
color: #ffffff;
text-decoration: none;
background: #40628a;
border: 1px solid #161616;
cursor: pointer;
display: inline-block;
}
a:hover, .linkActive:hover {
background: #507aac;
cursor: pointer;
}
p {
text-align: center;
font-size: 11px;
margin: 0px;
}
table {
width: 560px;
text-align: center;
}
td {
width: 560px;
}
.chem-select {
width: 560px;
text-align: center;
}
.enabled {
background-color: #0a0;
}
.disabled {
background-color: #a00;
}
.shown {
display: block;
}
.hidden {
display: none;
}
</style>
<script src="jquery.min.js"></script>
<script type='text/javascript'>
function update_chemicals(chemicals) {
$('#chemicals').text(chemicals);
}
$(function() {
});
</script>
</head>
<body scroll='yes'><div id='content'>
[content]
</div></body></html>"}
return html
@@ -1,5 +1,5 @@
#define CHALLENGE_TIME_LIMIT 6000
#define MIN_CHALLENGE_PLAYERS 50
#define CHALLENGE_MIN_PLAYERS 50
#define CHALLENGE_SHUTTLE_DELAY 15000 //25 minutes, so the ops have at least 5 minutes before the shuttle is callable.
/obj/item/device/nuclear_challenge
@@ -9,33 +9,42 @@
desc = "Use to send a declaration of hostilities to the target, delaying your shuttle departure for 20 minutes while they prepare for your assault. \
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 = 0
var/declaring_war = FALSE
/obj/item/device/nuclear_challenge/attack_self(mob/living/user)
if(declaring_war)
return
if(player_list.len < MIN_CHALLENGE_PLAYERS)
to_chat(user, "The enemy crew is too small to be worth declaring war on.")
return
if(!is_admin_level(user.z))
to_chat(user, "You have to be at your base to use this.")
if(!check_allowed(user))
return
if(world.time > CHALLENGE_TIME_LIMIT)
to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.")
declaring_war = TRUE
var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew? You have [-round((world.time-round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide.", "Declare war?", "Yes", "No")
declaring_war = FALSE
if(!check_allowed(user))
return
declaring_war = 1
var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew?", "Declare war?", "Yes", "No")
if(are_you_sure == "No")
to_chat(user, "On second thought, the element of surprise isn't so bad after all.")
declaring_war = 0
return
var/war_declaration = "[user.real_name] has declared his intent to utterly destroy [station_name()] with a nuclear device, and dares the crew to try and stop them."
declaring_war = TRUE
var/custom_threat = alert(user, "Do you want to customize your declaration?", "Customize?", "Yes", "No")
declaring_war = FALSE
if(!check_allowed(user))
return
if(custom_threat == "Yes")
declaring_war = TRUE
war_declaration = stripped_input(user, "Insert your custom declaration", "Declaration")
declaring_war = FALSE
if(!check_allowed(user) || !war_declaration)
return
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.")
for(var/obj/machinery/computer/shuttle/syndicate/S in machines)
@@ -47,7 +56,25 @@
config.shuttle_refuel_delay = CHALLENGE_SHUTTLE_DELAY
qdel(src)
/obj/item/device/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.")
return FALSE
if(player_list.len < CHALLENGE_MIN_PLAYERS)
to_chat(user, "The enemy crew is too small to be worth declaring war on.")
return FALSE
if(!is_admin_level(user.z))
to_chat(user, "You have to be at your base to use this.")
return FALSE
if(world.time > CHALLENGE_TIME_LIMIT)
to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.")
return FALSE
for(var/obj/machinery/computer/shuttle/syndicate/S in machines)
if(S.moved)
to_chat(user, "The shuttle has already been moved! You have forfeit the right to declare war.")
return FALSE
return TRUE
#undef CHALLENGE_TIME_LIMIT
#undef MIN_CHALLENGE_PLAYERS
#undef CHALLENGE_MIN_PLAYERS
#undef CHALLENGE_SHUTTLE_DELAY
+9 -4
View File
@@ -32,11 +32,16 @@
attached_spell.attached_hand = null
qdel(src)
/obj/item/weapon/melee/touch_attack/dropped()
if(attached_spell)
attached_spell.attached_hand = null
qdel(src)
/obj/item/weapon/melee/touch_attack/disintegrate
name = "disintegrating touch"
desc = "This hand of mine glows with an awesome power!"
catchphrase = "EI NATH!!"
on_use_sound = "sound/magic/Disintegrate.ogg"
on_use_sound = 'sound/magic/Disintegrate.ogg'
icon_state = "disintegrate"
item_state = "disintegrate"
@@ -54,7 +59,7 @@
name = "petrifying touch"
desc = "That's the bottom line, because flesh to stone said so!"
catchphrase = "STAUN EI!!"
on_use_sound = "sound/magic/FleshToStone.ogg"
on_use_sound = 'sound/magic/FleshToStone.ogg'
icon_state = "fleshtostone"
item_state = "fleshtostone"
@@ -73,7 +78,7 @@
name = "toy plastic hand"
desc = "This hand of mine glows with an awesome power! Ok, maybe just batteries."
catchphrase = "EI NATH!!"
on_use_sound = "sound/magic/Disintegrate.ogg"
on_use_sound = 'sound/magic/Disintegrate.ogg'
icon_state = "disintegrate"
item_state = "disintegrate"
@@ -90,7 +95,7 @@
name = "cluwne touch"
desc = "It's time to start clowning around."
catchphrase = "NWOLC EGNEVER"
on_use_sound = "sound/misc/sadtrombone.ogg"
on_use_sound = 'sound/misc/sadtrombone.ogg'
icon_state = "cluwnecurse"
item_state = "cluwnecurse"
+18 -11
View File
@@ -8,7 +8,7 @@
slot_flags = SLOT_BELT
origin_tech = "bluespace=4;materials=4"
var/imprinted = "empty"
var/usability = TRUE // Can this soul stone be used by anyone, or only cultists/wizards?
var/reusable = TRUE // Can this soul stone be used more than once?
var/spent = FALSE // If the soul stone can only be used once, has it been used?
@@ -18,7 +18,7 @@
return TRUE
return FALSE
/obj/item/device/soulstone/proc/was_used()
if(!reusable)
spent = TRUE
@@ -26,21 +26,21 @@
desc = "A fragment of the legendary treasure known simply as \
the 'Soul Stone'. The shard lies still, dull and lifeless; \
whatever spark it once held long extinguished."
/obj/item/device/soulstone/anybody
usability = TRUE
/obj/item/device/soulstone/anybody/chaplain
name = "mysterious old shard"
reusable = FALSE
/obj/item/device/soulstone/pickup(mob/living/user)
..()
if(!can_use(user))
to_chat(user, "<span class='danger'>An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly.</span>")
user.Dizzy(120)
//////////////////////////////Capturing////////////////////////////////////////////////////////
//////////////////////////////Capturing////////////////////////////////////////////////////////
/obj/item/device/soulstone/attack(mob/living/carbon/human/M as mob, mob/user as mob)
if(!can_use(user))
user.Paralyse(5)
@@ -53,7 +53,7 @@
if(!ishuman(M) || istype(M, /mob/living/carbon/human/dummy)) //If target is not a human or a dummy
return ..()
if(M.has_brain_worms()) //Borer stuff - RR
to_chat(user, "<span class='warning'>This being is corrupted by an alien intelligence and cannot be soul trapped.</span>")
return ..()
@@ -62,6 +62,13 @@
to_chat(user, "<span class='warning'>A mysterious force prevents you from trapping this being's soul.</span>")
return ..()
if(iscultist(M))
to_chat(user, "<span class='cultlarge'>This soul is already MINE.</span>")
return ..()
M.create_attack_log("<font color='orange'>Has had their soul captured with [src.name] by [key_name(user)]</font>")
user.create_attack_log("<font color='red'>Used the [src.name] to capture the soul of [key_name(M)]</font>")
M.create_attack_log("<font color='orange'>Has had their soul captured with [src.name] by [key_name(user)]</font>")
user.create_attack_log("<font color='red'>Used the [src.name] to capture the soul of [key_name(M)]</font>")
log_attack("<font color='red'>[key_name(user)] used the [src.name] to capture the soul of [key_name(M)]</font>")
@@ -69,7 +76,7 @@
transfer_soul("VICTIM", M, user)
return
///////////////////Options for using captured souls///////////////////////////////////////
///////////////////Options for using captured souls///////////////////////////////////////
/obj/item/device/soulstone/attack_self(mob/user)
if(!in_range(src, user))
return
@@ -77,8 +84,8 @@
if(!can_use(user))
user.Paralyse(5)
to_chat(user, "<span class='userdanger'>Your body is wracked with debilitating pain!</span>")
return
return
user.set_machine(src)
var/dat = "<TT><B>Soul Stone</B><BR>"
for(var/mob/living/simple_animal/shade/A in src)
@@ -127,7 +134,7 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "construct"
desc = "A wicked machine used by those skilled in magical arts. It is inactive"
/obj/structure/constructshell/examine(mob/user)
if(..(user, 0))
if(iscultist(user) || iswizard(user) || user.stat == DEAD)
+6 -1
View File
@@ -106,6 +106,11 @@
spell_type = /obj/effect/proc_holder/spell/fireball
log_name = "FB"
/datum/spellbook_entry/rod_form
name = "Rod Form"
spell_type = /obj/effect/proc_holder/spell/targeted/rod_form
log_name = "RF"
/datum/spellbook_entry/magicm
name = "Magic Missile"
spell_type = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile
@@ -853,7 +858,7 @@
spellname = "disintegrate"
icon_state ="bookfireball"
desc = "This book feels like it will rip stuff apart."
/obj/item/weapon/spellbook/oneuse/sacredflame
spell = /obj/effect/proc_holder/spell/targeted/sacred_flame
spellname = "sacred flame"
+1 -1
View File
@@ -8,7 +8,7 @@
supervisors = "your laws"
req_admin_notify = 1
minimal_player_age = 30
exp_requirements = 600
exp_requirements = 1200
exp_type = EXP_TYPE_CREW
equip(var/mob/living/carbon/human/H)
+3 -1
View File
@@ -13,7 +13,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
access = list() //See get_access()
minimal_access = list() //See get_access()
minimal_player_age = 30
exp_requirements = 600
exp_requirements = 1200
exp_type = EXP_TYPE_CREW
equip(var/mob/living/carbon/human/H)
if(!H) return 0
@@ -237,6 +237,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
minimal_access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels)
alt_titles = list("Lawyer","Public Defender")
minimal_player_age = 30
exp_requirements = 300
exp_type = EXP_TYPE_CREW
idtype = /obj/item/weapon/card/id/security
equip(var/mob/living/carbon/human/H)
+1 -1
View File
@@ -473,7 +473,7 @@
printing = 1
visible_message("<span class='notice'>\The [src] rattles and prints out a sheet of paper.</span>")
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
P.info = "<CENTER><B>Body Scan - [href_list["name"]]</B></CENTER><BR>"
P.info += "<b>Time of scan:</b> [worldtime2text(world.time)]<br><br>"
P.info += "[printing_text]"
+4 -4
View File
@@ -445,12 +445,12 @@ update_flag
else
logmsg = "Valve was <b>opened</b> by [usr] ([usr.ckey]), starting the transfer into the <font color='red'><b>air</b></font><br>"
if(air_contents.toxins > 0)
message_admins("[key_name_admin(usr)] opened a canister that contains plasma! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
log_admin("[key_name(usr)] opened a canister that contains plasma at [x], [y], [z]")
message_admins("[key_name_admin(usr)] opened a canister that contains plasma in [get_area(src)]! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
log_admin("[key_name(usr)] opened a canister that contains plasma at [get_area(src)]: [x], [y], [z]")
var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air_contents.trace_gases
if(sleeping_agent && (sleeping_agent.moles > 1))
message_admins("[key_name_admin(usr)] opened a canister that contains N2O! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
log_admin("[key_name(usr)] opened a canister that contains N2O at [x], [y], [z]")
message_admins("[key_name_admin(usr)] opened a canister that contains N2O in [get_area(src)]! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
log_admin("[key_name(usr)] opened a canister that contains N2O at [get_area(src)]: [x], [y], [z]")
investigate_log(logmsg, "atmos")
release_log += logmsg
valve_open = !valve_open
+1 -1
View File
@@ -137,7 +137,7 @@
user.visible_message("[user] begins to load \the [O] in \the [src]...",
"You begin to load a design from \the [O]...",
"You hear the chatter of a floppy drive.")
playsound(get_turf(src), "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
playsound(get_turf(src), 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
busy = 1
if(do_after(user, 14.4, target = src))
files.AddDesign2Known(D.blueprint)
+3
View File
@@ -124,6 +124,9 @@
buf.dna.unique_enzymes = md5(buf.dna.real_name)
buf.dna.UI=list(0x066,0x000,0x033,0x000,0x000,0x000,0xAF0,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x033,0x066,0x0FF,0x4DB,0x002,0x690,0x000,0x000)
//buf.dna.UI=list(0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x000,0x000,0x000,0x000,0x161,0xFBD,0xDEF) // Farmer Jeff
for(var/i in buf.dna.UI.len to DNA_UI_LENGTH)
buf.dna.UI += 0x000
buf.dna.ResetSE()
buf.dna.UpdateUI()
/obj/item/weapon/disk/data/monkey
+28 -14
View File
@@ -37,18 +37,19 @@
off_action.Activate()
/obj/machinery/computer/camera_advanced/attack_hand(mob/user)
if(..())
return
if(!iscarbon(user))
return
if(current_user)
to_chat(user, "The console is already in use!")
return
if(!iscarbon(user))
return
if(..())
return
user.set_machine(src)
if(!eyeobj)
CreateEye()
if(!eyeobj.initialized)
if(!eyeobj.eye_initialized)
var/camera_location
for(var/obj/machinery/camera/C in cameranet.cameras)
if(!C.can_use())
@@ -57,7 +58,7 @@
camera_location = get_turf(C)
break
if(camera_location)
eyeobj.initialized = 1
eyeobj.eye_initialized = 1
give_eye_control(user)
eyeobj.setLoc(camera_location)
else
@@ -66,6 +67,7 @@
user.unset_machine()
else
give_eye_control(user)
eyeobj.setLoc(eyeobj.loc)
/obj/machinery/computer/camera_advanced/proc/give_eye_control(mob/user)
@@ -77,7 +79,6 @@
user.remote_view = 1
user.remote_control = eyeobj
user.reset_perspective(eyeobj)
eyeobj.setLoc(eyeobj.loc)
/mob/camera/aiEye/remote
name = "Inactive Camera Eye"
@@ -86,10 +87,15 @@
var/acceleration = 1
var/mob/living/carbon/human/eye_user = null
var/obj/machinery/computer/camera_advanced/origin
var/initialized = 0
var/eye_initialized = 0
var/visible_icon = 0
var/image/user_image = null
/mob/camera/aiEye/remote/Destroy()
eye_user = null
origin = null
return ..()
/mob/camera/aiEye/remote/GetViewerClient()
if(eye_user)
return eye_user.client
@@ -102,12 +108,11 @@
T = get_turf(T)
loc = T
cameranet.visibility(src)
if(eye_user.client)
if(visible_icon)
if(visible_icon)
if(eye_user.client)
eye_user.client.images -= user_image
user_image = image(icon,loc,icon_state,FLY_LAYER)
eye_user.client.images += user_image
eye_user.client.eye = src
/mob/camera/aiEye/remote/relaymove(mob/user,direct)
var/initial = initial(sprint)
@@ -140,14 +145,16 @@
remote_eye.origin.current_user = null
remote_eye.origin.jump_action.Remove(C)
remote_eye.eye_user = null
C.reset_perspective(null)
if(C.client)
C.client.images -= remote_eye.user_image
C.reset_perspective(null)
if(remote_eye.visible_icon)
C.client.images -= remote_eye.user_image
for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
C.client.images -= chunk.obscured
C.remote_control = null
C.unset_machine()
src.Remove(C)
playsound(remote_eye.origin, 'sound/machines/terminal_off.ogg', 25, 0)
/datum/action/innate/camera_jump
name = "Jump To Camera"
@@ -175,7 +182,14 @@
T[text("[][]", netcam.c_tag, (netcam.can_use() ? null : " (Deactivated)"))] = netcam
playsound(origin, 'sound/machines/terminal_prompt.ogg', 25, 0)
var/camera = input("Choose which camera you want to view", "Cameras") as null|anything in T
var/obj/machinery/camera/final = T[camera]
playsound(origin, "terminal_type", 25, 0)
if(final)
playsound(origin, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0)
remote_eye.setLoc(get_turf(final))
C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/noise)
C.clear_fullscreen("flash", 3) //Shorter flash than normal since it's an ~~advanced~~ console!
else
playsound(origin, 'sound/machines/terminal_prompt_deny.ogg', 25, 0)
+1 -1
View File
@@ -362,7 +362,7 @@ var/time_last_changed_position = 0
if("print")
if(!printing)
printing = 1
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
spawn(50)
printing = null
nanomanager.update_uis(src)
+1 -1
View File
@@ -465,7 +465,7 @@
if(href_list["print_p"])
if(!( src.printing ))
src.printing = 1
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
sleep(50)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc )
P.info = "<CENTER><B>Medical Record</B></CENTER><BR>"
+1 -1
View File
@@ -63,7 +63,7 @@
src.spark_system.start()
var/obj/item/weapon/paper/monitorkey/MK = new/obj/item/weapon/paper/monitorkey
MK.loc = src.loc
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
// Will help make emagging the console not so easy to get away with.
MK.info += "<br><br><font color='red'>£%@%(*$%&(£&?*(%&£/{}</font>"
update_icon()
+2 -2
View File
@@ -318,7 +318,7 @@ What a mess.*/
if("Print Record")
if(!( printing ))
printing = 1
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
sleep(50)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
P.info = "<CENTER><B>Security Record</B></CENTER><BR>"
@@ -341,7 +341,7 @@ What a mess.*/
if("Print Photo")
if(!printing)
printing = 1
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
sleep(50)
if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
create_record_photo(active1)
+1 -1
View File
@@ -253,7 +253,7 @@ What a mess.*/
if("Print Record")
if(!( printing ))
printing = 1
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
sleep(50)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
P.info = "<CENTER><B>Employment Record</B></CENTER><BR>"
+1 -1
View File
@@ -159,7 +159,7 @@
// to_chat(usr, "Printing the log, standby...")
//sleep(50)
var/obj/item/weapon/paper/P = new/obj/item/weapon/paper( loc )
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
P.name = "activity log"
P.info = dat
+3 -7
View File
@@ -46,17 +46,13 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter/precise
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
ME.attach(src)
/obj/mecha/combat/gygax/dark/add_cell(var/obj/item/weapon/stock_parts/cell/C=null)
if(C)
C.forceMove(src)
cell = C
return
cell = new(src)
/obj/mecha/combat/gygax/dark/add_cell()
cell = new /obj/item/weapon/stock_parts/cell/bluespace(src)
cell.charge = 30000
cell.maxcharge = 30000
+6 -1
View File
@@ -50,6 +50,11 @@
force = 55
max_equip = 5
/obj/mecha/combat/marauder/seraph/add_cell()
cell = new /obj/item/weapon/stock_parts/cell/bluespace(src)
cell.charge = 40000
cell.maxcharge = 40000
/obj/mecha/combat/marauder/seraph/loaded/New()
..()//Let it equip whatever is needed.
var/obj/item/mecha_parts/mecha_equipment/ME
@@ -61,7 +66,7 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src)
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter/precise(src)
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
+10 -2
View File
@@ -9,17 +9,25 @@
icon_state = "mecha_teleport"
origin_tech = "bluespace=10"
equip_cooldown = 150
energy_drain = 1000
energy_drain = 8000
range = RANGED
var/tele_precision = 4
/obj/item/mecha_parts/mecha_equipment/teleporter/action(atom/target)
if(!action_checks(target) || !is_teleport_allowed(loc.z))
return
var/turf/T = get_turf(target)
if(T)
do_teleport(chassis, T, 4)
chassis.use_power(energy_drain)
do_teleport(chassis, T, tele_precision)
return 1
/obj/item/mecha_parts/mecha_equipment/teleporter/precise
name = "upgraded teleporter"
desc = "An exosuit module that allows exosuits to teleport to any position in view. This is the high-precision, energy-efficient version."
origin_tech = "bluespace=13"
energy_drain = 1000
tele_precision = 1
////////////////////////////////////////////// WORMHOLE GENERATOR //////////////////////////////////////////
+1 -1
View File
@@ -237,7 +237,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine/silenced
name = "\improper S.H.H. \"Quietus\" Carbine"
fire_sound = "sound/weapons/Gunshot_silenced.ogg"
fire_sound = 'sound/weapons/Gunshot_silenced.ogg'
icon_state = "mecha_mime"
equip_cooldown = 15
projectile = /obj/item/projectile/bullet/mime
+3 -3
View File
@@ -750,7 +750,7 @@ steam.start() -- spawns the effect
var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition)
I.dir = src.holder.dir
flick("ion_fade", I)
I.icon_state = "blank"
I.icon_state = ""
spawn( 20 )
if(I)
I.delete()
@@ -812,8 +812,8 @@ steam.start() -- spawns the effect
II.dir = src.holder.dir
flick("ion_fade", I)
flick("ion_fade", II)
I.icon_state = "blank"
II.icon_state = "blank"
I.icon_state = ""
II.icon_state = ""
spawn( 20 )
if(I) I.delete()
if(II) II.delete()
+10 -5
View File
@@ -77,7 +77,7 @@
drawtype = temp
update_window(usr)
/obj/item/toy/crayon/afterattack(atom/target, mob/user as mob, proximity)
/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity)
if(!proximity) return
if(is_type_in_list(target,validSurfaces))
var/temp = "rune"
@@ -95,17 +95,22 @@
if(!uses)
to_chat(user, "<span class='danger'>You used up your [name]!</span>")
qdel(src)
return
/obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob)
/obj/item/toy/crayon/attack(mob/M, mob/user)
var/huffable = istype(src,/obj/item/toy/crayon/spraycan)
if(M == user)
to_chat(user, "You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!")
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(!H.check_has_mouth())
to_chat(user, "<span class='warning'>You do not have a mouth!</span>")
return
playsound(loc, 'sound/items/eatfood.ogg', 50, 0)
to_chat(user, "<span class='notice'>You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!</span>")
user.nutrition += 5
if(uses)
uses -= 5
if(uses <= 0)
to_chat(user, "<span class='danger'>There is no more of [name] left!</span>")
to_chat(user, "<span class='warning'>There is no more of [name] left!</span>")
qdel(src)
else
..()
+1 -1
View File
@@ -151,7 +151,7 @@
for(var/mob/O in viewers(usr))
O.show_message("\red \the [src] rattles and prints out a sheet of paper.", 1)
playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
sleep(10)
var/obj/item/weapon/paper/P = new(usr.loc)
+1 -4
View File
@@ -25,10 +25,7 @@
ui_interact(user)
/obj/item/device/guitar/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user)
return
if(!isliving(user) || user.stat || user.restrained() || user.lying)
if(!isliving(user) || user.incapacitated())
return
song.ui_interact(user, ui_key, ui, force_open)
+23 -18
View File
@@ -11,11 +11,16 @@
var/obj/item/device/radio/radio
var/looking_for_personality = 0
var/mob/living/silicon/pai/pai
var/list/faction = list("neutral") // The factions the pAI will inherit from the card
/obj/item/device/paicard/syndicate
name = "syndicate personal AI device"
faction = list("syndicate")
/obj/item/device/paicard/relaymove(var/mob/user, var/direction)
if(user.stat || user.stunned)
return
var/obj/item/weapon/rig/rig = src.get_rig()
var/obj/item/weapon/rig/rig = get_rig()
if(istype(rig))
rig.forced_move(direction, user)
@@ -260,7 +265,7 @@
to_chat(usr, "\red The request system is currently offline. Please wait another [cooldown_time] seconds.")
return
last_request = world.time / 10
src.looking_for_personality = 1
looking_for_personality = 1
paiController.findPAI(src, usr)
if(href_list["wipe"])
var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No")
@@ -297,33 +302,33 @@
// WIRE_TRANSMIT = 4
/obj/item/device/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
src.pai = personality
src.overlays += "pai-happy"
pai = personality
overlays += "pai-happy"
/obj/item/device/paicard/proc/removePersonality()
src.pai = null
src.overlays.Cut()
src.overlays += "pai-off"
pai = null
overlays.Cut()
overlays += "pai-off"
/obj/item/device/paicard
var/current_emotion = 1
/obj/item/device/paicard/proc/setEmotion(var/emotion)
if(pai)
src.overlays.Cut()
overlays.Cut()
switch(emotion)
if(1) src.overlays += "pai-happy"
if(2) src.overlays += "pai-cat"
if(3) src.overlays += "pai-extremely-happy"
if(4) src.overlays += "pai-face"
if(5) src.overlays += "pai-laugh"
if(6) src.overlays += "pai-off"
if(7) src.overlays += "pai-sad"
if(8) src.overlays += "pai-angry"
if(9) src.overlays += "pai-what"
if(1) overlays += "pai-happy"
if(2) overlays += "pai-cat"
if(3) overlays += "pai-extremely-happy"
if(4) overlays += "pai-face"
if(5) overlays += "pai-laugh"
if(6) overlays += "pai-off"
if(7) overlays += "pai-sad"
if(8) overlays += "pai-angry"
if(9) overlays += "pai-what"
current_emotion = emotion
/obj/item/device/paicard/proc/alertUpdate()
var/turf/T = get_turf_or_move(src.loc)
var/turf/T = get_turf_or_move(loc)
for(var/mob/M in viewers(T))
M.show_message("\blue [src] flashes a message across its screen, \"Additional personalities available for download.\"", 3, "\blue [src] bleeps electronically.", 2)
@@ -231,7 +231,7 @@
return
to_chat(usr, "<span class='notice'>Transcript printed.</span>")
playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src))
var/t1 = "<B>Transcript:</B><BR><BR>"
for(var/i = 1, mytape.storedinfo.len >= i, i++)
+1 -4
View File
@@ -30,10 +30,7 @@
ui_interact(user)
/obj/item/device/violin/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user)
return
if(!isliving(user) || user.stat || user.restrained() || user.lying)
if(!isliving(user) || user.incapacitated())
return
song.ui_interact(user, ui_key, ui, force_open)
+10 -2
View File
@@ -7,7 +7,7 @@ RCD
/obj/item/weapon/rcd
name = "rapid-construction-device (RCD)"
desc = "A device used to rapidly build and deconstruct walls and floors."
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tools.dmi'
icon_state = "rcd"
opacity = 0
density = 0
@@ -28,6 +28,7 @@ RCD
var/canRwall = 0
var/menu = 1
var/door_type = /obj/machinery/door/airlock
var/door_name = "Airlock"
req_access = list(access_engine)
var/list/door_accesses = list()
var/list/door_accesses_list = list()
@@ -85,7 +86,7 @@ RCD
/obj/item/weapon/rcd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "rcd.tmpl", "[name]", 400, 400, state = state)
ui = new(user, src, ui_key, "rcd.tmpl", "[name]", 450, 400, state = state)
ui.open()
ui.set_auto_update(1)
@@ -93,6 +94,7 @@ RCD
var/data[0]
data["mode"] = mode
data["door_type"] = door_type
data["door_name"] = door_name
data["menu"] = menu
data["matter"] = matter
data["max_matter"] = max_matter
@@ -164,6 +166,11 @@ RCD
door_accesses_list[++door_accesses_list.len] = list("name" = get_access_desc(access), "id" = access, "enabled" = (access in door_accesses))
. = 1
if(href_list["choice"] && !locked)
var/temp_t = sanitize(copytext(input("Enter a custom Airlock Name.","Airlock Name"),1,MAX_MESSAGE_LEN))
if(temp_t)
door_name = temp_t
/obj/item/weapon/rcd/proc/activate()
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
@@ -207,6 +214,7 @@ RCD
if(!useResource(10, user)) return 0
activate()
var/obj/machinery/door/airlock/T = new door_type(A)
T.name = door_name
T.autoclose = 1
if(one_access)
T.req_one_access = door_accesses.Copy()
+2 -2
View File
@@ -6,8 +6,8 @@ RSF
/obj/item/weapon/rsf
name = "\improper Rapid-Service-Fabricator"
desc = "A device used to rapidly deploy service items."
icon = 'icons/obj/items.dmi'
icon_state = "rcd"
icon = 'icons/obj/tools.dmi'
icon_state = "rsf"
opacity = 0
density = 0
anchored = 0.0
+3 -3
View File
@@ -78,7 +78,7 @@
species_hair = hair_styles_list
var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair
user.visible_message("<span class='notice'>[user] starts cutting [M]'s hair!</span>", "<span class='notice'>You start cutting [M]'s hair!</span>") //arguments for this are: 1. what others see 2. what the user sees. --Fixed grammar, (TGameCo)
playsound(loc, "sound/goonstation/misc/Scissor.ogg", 100, 1)
playsound(loc, 'sound/goonstation/misc/Scissor.ogg', 100, 1)
if(do_after(user, 50, target = H)) //this is the part that adds a delay. delay is in deciseconds. --Made it 5 seconds, because hair isn't cut in one second in real life, and I want at least a little bit longer time, (TGameCo)
if(!(M in view(1))) //Adjacency test
user.visible_message("<span class='notice'>[user] stops cutting [M]'s hair.</span>", "<span class='notice'>You stop cutting [M]'s hair.</span>")
@@ -111,9 +111,9 @@
if(!is_cutting)
is_cutting = 1
user.visible_message("<span class='notice'>[user] starts cutting [M]'s hair!</span>", "<span class='notice'>You start cutting [M]'s hair!</span>")
playsound(loc, "sound/goonstation/misc/Scissor.ogg", 100, 1)
playsound(loc, 'sound/goonstation/misc/Scissor.ogg', 100, 1)
if(do_after(user, 50, target = H))
playsound(loc, "sound/weapons/bladeslice.ogg", 50, 1, -1)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
user.visible_message("<span class='danger'>[user] abruptly stops cutting [M]'s hair and slices their throat!</span>", "<span class='danger'>You stop cutting [M]'s hair and slice their throat!</span>") //Just a little off the top.
H.AdjustLoseBreath(10) //30 Oxy damage over time
H.apply_damage(18, BRUTE, "head", sharp =1, edge =1, used_weapon = "scissors")
@@ -13,7 +13,7 @@
materials = list(MAT_METAL = 500)
origin_tech = "combat=1"
attack_verb = list("robusted")
hitsound = "sound/weapons/smash.ogg"
hitsound = 'sound/weapons/smash.ogg'
New()
..()
@@ -184,7 +184,6 @@
name = "vox specialized nitrogen tank"
desc = "A high-tech nitrogen tank designed specifically for Vox."
icon_state = "emergency_vox"
item_state = "emergency_vox"
volume = 25
/obj/item/weapon/tank/emergency_oxygen/vox/New()
+48 -71
View File
@@ -12,47 +12,42 @@
* Revolver Conversion Kit
*/
/*
* Wrench
*/
//Wrench
/obj/item/weapon/wrench
name = "wrench"
desc = "A wrench with common uses. Can be found in your hand."
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tools.dmi'
icon_state = "wrench"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5.0
throwforce = 7.0
force = 5
throwforce = 7
w_class = 2
materials = list(MAT_METAL=150)
origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
/*
* Screwdriver
*/
//Screwdriver
/obj/item/weapon/screwdriver
name = "screwdriver"
desc = "You can be totally screwy with this."
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tools.dmi'
icon_state = "screwdriver"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5.0
force = 5
w_class = 1
throwforce = 5.0
throwforce = 5
throw_speed = 3
throw_range = 5
materials = list(MAT_METAL=75)
attack_verb = list("stabbed")
hitsound = 'sound/weapons/bladeslice.ogg'
suicide_act(mob/user)
to_chat(viewers(user), pick("<span class='suicide'>[user] is stabbing the [src.name] into \his temple! It looks like \he's trying to commit suicide.</span>", \
"<span class='suicide'>[user] is stabbing the [src.name] into \his heart! It looks like \he's trying to commit suicide.</span>"))
return(BRUTELOSS)
/obj/item/weapon/screwdriver/suicide_act(mob/user)
to_chat(viewers(user), pick("<span class='suicide'>[user] is stabbing the [name] into \his temple! It looks like \he's trying to commit suicide.</span>", \
"<span class='suicide'>[user] is stabbing the [name] into \his heart! It looks like \he's trying to commit suicide.</span>"))
return(BRUTELOSS)
/obj/item/weapon/screwdriver/New()
switch(pick("red","blue","purple","brown","green","cyan","yellow"))
@@ -82,7 +77,7 @@
src.pixel_y = rand(0, 16)
return
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!istype(M) || user.a_intent == I_HELP)
return ..()
if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head")
@@ -91,72 +86,60 @@
M = user
return eyestab(M,user)
/*
* Wirecutters
*/
//Wirecutters
/obj/item/weapon/wirecutters
name = "wirecutters"
desc = "This cuts wires."
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tools.dmi'
icon_state = "cutters"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 6.0
force = 6
throw_speed = 3
throw_range = 7
w_class = 2
materials = list(MAT_METAL=80)
origin_tech = "materials=1;engineering=1"
attack_verb = list("pinched", "nipped")
hitsound = "sound/items/Wirecutter.ogg"
hitsound = 'sound/items/Wirecutter.ogg'
sharp = 1
edge = 1
/obj/item/weapon/wirecutters/New(loc, var/param_color = null)
/obj/item/weapon/wirecutters/New(loc, param_color = null)
..()
if((!param_color && prob(50)) || param_color == "yellow")
icon_state = "cutters-y"
item_state = "cutters_yellow"
/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/C as mob, mob/user as mob)
if(istype(C) && C.handcuffed)
if(istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\
"You cut \the [C]'s restraints with \the [src]!",\
/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/H, mob/user)
if(istype(H) && H.handcuffed)
if(istype(H.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
usr.visible_message("\The [usr] cuts \the [H]'s restraints with \the [src]!",\
"You cut \the [H]'s restraints with \the [src]!",\
"You hear cable being cut.")
C.handcuffed = null
if(C.buckled && C.buckled.buckle_requires_restraints)
C.buckled.unbuckle_mob()
C.update_handcuffed()
H.handcuffed = null
if(H.buckled && H.buckled.buckle_requires_restraints)
H.buckled.unbuckle_mob()
H.update_handcuffed()
return
else
..()
/*
* Welding Tool
*/
//Welding Tool
/obj/item/weapon/weldingtool
name = "welding tool"
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tools.dmi'
icon_state = "welder"
item_state = "welder"
flags = CONDUCT
slot_flags = SLOT_BELT
//Amount of OUCH when it's thrown
force = 3
throwforce = 5
throw_speed = 3
throw_range = 5
w_class = 2
//Cost to make in the autolathe
materials = list(MAT_METAL=70, MAT_GLASS=30)
//R&D tech level
origin_tech = "engineering=1"
//Welding tool specific stuff
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
var/max_fuel = 20 //The max amount of fuel the welder can hold
@@ -169,7 +152,6 @@
create_reagents(max_fuel)
reagents.add_reagent("fuel", max_fuel)
update_icon()
return
/obj/item/weapon/weldingtool/examine(mob/user)
if(..(user, 0))
@@ -196,10 +178,9 @@
else
icon_state = "[initial(icon_state)][ratio]"
update_torch()
return
/obj/item/weapon/weldingtool/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I, /obj/item/weapon/screwdriver))
/obj/item/weapon/weldingtool/attackby(obj/item/I, mob/user, params)
if(isscrewdriver(I))
flamethrower_screwdriver(I, user)
if(istype(I, /obj/item/stack/rods))
flamethrower_rods(I, user)
@@ -231,7 +212,7 @@
if(isturf(location))
location.hotspot_expose(700, 5)
/obj/item/weapon/weldingtool/attack(mob/M as mob, mob/user as mob)
/obj/item/weapon/weldingtool/attack(mob/M, mob/user)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting]
@@ -289,7 +270,7 @@
return reagents.get_reagent_amount("fuel")
//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use()
/obj/item/weapon/weldingtool/proc/remove_fuel(var/amount = 1, var/mob/living/M = null)
/obj/item/weapon/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null)
if(!welding || !check_fuel())
return 0
if(get_fuel() >= amount)
@@ -402,7 +383,7 @@
/obj/item/weapon/weldingtool/hugetank
name = "Upgraded Welding Tool"
desc = "An upgraded welder based of the industrial welder."
desc = "An upgraded welder based off the industrial welder."
icon_state = "upindwelder"
item_state = "upindwelder"
max_fuel = 80
@@ -419,10 +400,10 @@
w_class = 3
materials = list(MAT_METAL=70, MAT_GLASS=120)
origin_tech = "engineering=4;plasmatech=3"
var/last_gen = 0
change_icons = 0
can_off_process = 1
light_intensity = 1
var/last_gen = 0
/obj/item/weapon/weldingtool/experimental/proc/fuel_gen()
if(!welding && !last_gen)
@@ -436,19 +417,16 @@
if(reagents.total_volume < max_fuel)
fuel_gen()
/*
* Crowbar
*/
//Crowbar
/obj/item/weapon/crowbar
name = "pocket crowbar"
desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors."
icon = 'icons/obj/items.dmi'
icon = 'icons/obj/tools.dmi'
icon_state = "crowbar"
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5.0
throwforce = 7.0
force = 5
throwforce = 7
item_state = "crowbar"
w_class = 2
materials = list(MAT_METAL=50)
@@ -456,7 +434,6 @@
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
/obj/item/weapon/crowbar/red
icon = 'icons/obj/items.dmi'
icon_state = "red_crowbar"
item_state = "crowbar_red"
@@ -480,14 +457,14 @@
origin_tech = "combat=2"
var/open = 0
New()
..()
update_icon()
/obj/item/weapon/conversion_kit/New()
..()
update_icon()
icon_state = "[initial(icon_state)]_[open]"
attack_self(mob/user as mob)
open = !open
to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.")
update_icon()
/obj/item/weapon/conversion_kit/update_icon()
icon_state = "[initial(icon_state)]_[open]"
/obj/item/weapon/conversion_kit/attack_self(mob/user)
open = !open
to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.")
update_icon()
@@ -1,6 +1,7 @@
/obj/structure/closet/cardboard
name = "large cardboard box"
desc = "Just a box..."
icon = 'icons/obj/cardboard_boxes.dmi'
icon_state = "cardboard"
icon_opened = "cardboard_open"
icon_closed = "cardboard"
@@ -43,7 +44,7 @@
/mob/living/proc/do_alert_animation(atom/A)
var/image/I
I = image('icons/obj/closet.dmi', A, "cardboard_special", A.layer+1)
I = image('icons/obj/cardboard_boxes.dmi', A, "cardboard_special", A.layer+1)
var/list/viewing = list()
for(var/mob/M in viewers(A))
if(M.client)
@@ -52,6 +53,7 @@
I.alpha = 0
animate(I, pixel_z = 32, alpha = 255, time = 5, easing = ELASTIC_EASING)
/obj/structure/closet/cardboard/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(src.opened)
if(istype(W, /obj/item/weapon/weldingtool))
@@ -62,3 +64,25 @@
for(var/mob/M in viewers(src))
M.show_message("<span class='notice'>\The [src] has been cut apart by [user] with \the [WC].</span>", 3, "You hear cutting.", 2)
qdel(src)
return
if(istype(W, /obj/item/weapon/pen))
var/decalselection = input("Please select a decal") as null|anything in list("Atmospherics", "Bartender", "Barber", "Blueshield", "Brig Physician", "Captain",
"Cargo", "Chief Engineer", "Chaplain", "Chef", "Chemist", "Civilian", "Clown", "CMO", "Coroner", "Detective", "Engineering", "Genetics", "HOP",
"HOS", "Hydroponics", "Internal Affairs Agent", "Janitor", "Magistrate", "Mechanic", "Medical", "Mime", "Mining", "NT Representative", "Paramedic", "Pod Pilot",
"Prisoner", "Research Director", "Security", "Syndicate", "Therapist", "Virology", "Warden", "Xenobiology")
if(!decalselection)
return
if(user.incapacitated())
to_chat(user, "You're in no condition to perform this action.")
return
if(W != user.get_active_hand())
to_chat(user, "You must be holding the pen to perform this action.")
return
if(! Adjacent(user))
to_chat(user, "You have moved too far away from the cardboard box.")
return
decalselection = replacetext(decalselection, " ", "_")
decalselection = lowertext(decalselection)
icon_opened = ("cardboard_open_"+decalselection)
icon_closed = ("cardboard_"+decalselection)
update_icon() // a proc declared in the closets parent file used to update opened/closed sprites on normal closets
@@ -3,7 +3,7 @@
/obj/structure/closet/crate
name = "crate"
desc = "A rectangular steel crate."
icon = 'icons/obj/storage.dmi'
icon = 'icons/obj/crates.dmi'
icon_state = "crate"
icon_opened = "crateopen"
icon_closed = "crate"
@@ -490,7 +490,6 @@
/obj/structure/closet/crate/large
name = "large crate"
desc = "A hefty metal crate."
icon = 'icons/obj/storage.dmi'
icon_state = "largemetal"
icon_opened = "largemetalopen"
icon_closed = "largemetal"
@@ -515,7 +514,6 @@
/obj/structure/closet/crate/secure/large
name = "large crate"
desc = "A hefty metal crate with an electronic locking system."
icon = 'icons/obj/storage.dmi'
icon_state = "largemetal"
icon_opened = "largemetalopen"
icon_closed = "largemetal"
@@ -1,8 +1,8 @@
/obj/structure/largecrate
name = "large crate"
desc = "A hefty wooden crate."
icon = 'icons/obj/storage.dmi'
icon_state = "densecrate"
icon = 'icons/obj/crates.dmi'
icon_state = "largecrate"
density = 1
var/obj/item/weapon/paper/manifest/manifest
@@ -49,7 +49,6 @@
return attack_hand(user)
/obj/structure/largecrate/mule
icon_state = "mulecrate"
/obj/structure/largecrate/lisa
icon_state = "lisacrate"
@@ -79,7 +79,7 @@
if(victim.buckled)
return 0
var/mob/living/H = victim
playsound(loc, "sound/effects/splat.ogg", 25, 1)
playsound(loc, 'sound/effects/splat.ogg', 25, 1)
H.forceMove(loc)
H.emote("scream")
if(istype(H, /mob/living/carbon/human)) //So you don't get human blood when you spike a giant spidere
+5 -3
View File
@@ -138,10 +138,10 @@
return data
/datum/song/Topic(href, href_list)
if(!in_range(instrumentObj, usr) || (issilicon(usr) && instrumentObj.loc != usr) || !isliving(usr) || !usr.canmove || usr.restrained())
if(!in_range(instrumentObj, usr) || (issilicon(usr) && instrumentObj.loc != usr) || !isliving(usr) || usr.incapacitated())
usr << browse(null, "window=instrument")
usr.unset_machine()
return
return 1
instrumentObj.add_fingerprint(usr)
@@ -168,6 +168,8 @@
//split into lines
spawn()
lines = splittext(t, "\n")
if(lines.len == 0)
return 1
if(copytext(lines[1],1,6) == "BPM: ")
tempo = sanitize_tempo(600 / text2num(copytext(lines[1],6)))
lines.Cut(1,2)
@@ -291,7 +293,7 @@
ui_interact(user)
/obj/structure/piano/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user || !anchored)
if(!isliving(user) || user.incapacitated() || !anchored)
return
song.ui_interact(user, ui_key, ui, force_open)
+15 -9
View File
@@ -5,6 +5,9 @@
#define ERT_TYPE_RED 2
#define ERT_TYPE_GAMMA 3
/datum/game_mode
var/list/datum/mind/ert = list()
var/list/response_team_members = list()
var/responseteam_age = 21 // Minimum account age to play as an ERT member
var/datum/response_team/active_team = null
@@ -93,7 +96,7 @@ var/ert_request_answered = 0
if(response_team_members.len > 6)
to_chat(src, "The emergency response team is already full!")
return 0
return 1
/proc/trigger_armed_response_team(var/datum/response_team/response_team_type)
@@ -106,7 +109,7 @@ var/ert_request_answered = 0
active_team.cannot_send_team()
send_emergency_team = 0
return 0
// Respawnable players get first dibs
for(var/mob/dead/observer/M in ert_candidates)
if((M in respawnable_list) && M.JoinResponseTeam())
@@ -115,7 +118,7 @@ var/ert_request_answered = 0
for(var/mob/dead/observer/M in (ert_candidates - respawnable_list))
if(M.JoinResponseTeam())
response_team_members |= M
if(!response_team_members.len)
active_team.cannot_send_team()
send_emergency_team = 0
@@ -125,14 +128,14 @@ var/ert_request_answered = 0
for(var/mob/M in response_team_members)
if(index > emergencyresponseteamspawn.len)
index = 1
var/client/C = M.client
var/mob/living/carbon/human/new_commando = C.create_response_team(emergencyresponseteamspawn[index])
new_commando.mind.key = M.key
new_commando.key = M.key
new_commando.update_icons()
index++
send_emergency_team = 0
active_team.announce_team()
return 1
@@ -170,8 +173,8 @@ var/ert_request_answered = 0
head_organ.b_hair = color2B(hair_c)
M.change_eye_color(color2R(eye_c), color2G(eye_c), color2B(eye_c))
M.s_tone = skin_tone
head_organ.h_style = random_hair_style(M.gender, head_organ.species.name)
head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name)
head_organ.h_style = random_hair_style(M.gender, head_organ.species.name)
head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name)
M.real_name = "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]"
M.name = M.real_name
@@ -187,6 +190,7 @@ var/ert_request_answered = 0
M.mind.special_role = SPECIAL_ROLE_ERT
if(!(M.mind in ticker.minds))
ticker.minds += M.mind //Adds them to regular mind list.
ticker.mode.ert += M.mind
M.forceMove(spawn_location)
active_team.equip_officer(class, M)
@@ -256,6 +260,7 @@ var/ert_request_answered = 0
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.icon_state = "pda-engineer"
M.equip_to_slot_or_del(pda, slot_wear_pda)
M.job = "ERT Engineering"
if("Security")
@@ -280,7 +285,7 @@ var/ert_request_answered = 0
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.icon_state = "pda-security"
M.equip_to_slot_or_del(pda, slot_wear_pda)
M.job = "ERT Security"
if("Medic")
medical_slots -= 1
@@ -302,7 +307,7 @@ var/ert_request_answered = 0
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.icon_state = "pda-medical"
M.equip_to_slot_or_del(pda, slot_wear_pda)
M.job = "ERT Medical"
if("Commander")
command_slots = 0
@@ -329,6 +334,7 @@ var/ert_request_answered = 0
pda.ownjob = "Emergency Response Team Leader"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
M.equip_to_slot_or_del(pda, slot_wear_pda)
M.job = "ERT Commander"
/datum/response_team/proc/cannot_send_team()
event_announcement.Announce("[station_name()], we are unfortunately unable to send you an Emergency Response Team at this time.", "ERT Unavailable")
+5
View File
@@ -12,6 +12,9 @@ var/list/page_sound = list('sound/effects/pageturn1.ogg', 'sound/effects/pagetur
var/list/gun_sound = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg')
var/list/computer_ambience = list('sound/goonstation/machines/ambicomp1.ogg', 'sound/goonstation/machines/ambicomp2.ogg', 'sound/goonstation/machines/ambicomp3.ogg')
var/list/ricochet = list('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg','sound/weapons/effects/ric3.ogg','sound/weapons/effects/ric4.ogg','sound/weapons/effects/ric5.ogg')
var/list/terminal_type = list('sound/machines/terminal_button01.ogg', 'sound/machines/terminal_button02.ogg', 'sound/machines/terminal_button03.ogg',
'sound/machines/terminal_button04.ogg', 'sound/machines/terminal_button05.ogg', 'sound/machines/terminal_button06.ogg',
'sound/machines/terminal_button07.ogg', 'sound/machines/terminal_button08.ogg')
/proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num, falloff, var/is_global, var/pitch)
@@ -137,4 +140,6 @@ var/list/ricochet = list('sound/weapons/effects/ric1.ogg', 'sound/weapons/effect
soundin = pick(computer_ambience)
if("ricochet")
soundin = pick(ricochet)
if("terminal_type")
soundin = pick(terminal_type)
return soundin
+2 -2
View File
@@ -73,10 +73,10 @@
icons = list("bananium","bananium_dam")
var/spam_flag = 0
/turf/simulated/floor/mineral/bananium/Entered(mob/AM)
/turf/simulated/floor/mineral/bananium/Entered(mob/living/M)
.=..()
if(!.)
if(istype(AM))
if(istype(M))
squeek()
/turf/simulated/floor/mineral/bananium/attackby(obj/item/weapon/W, mob/user, params)