Merge branch 'master' into ItemNameFixingRound3

This commit is contained in:
Kyrah Abattoir
2013-12-10 17:32:45 +01:00
192 changed files with 2709 additions and 1711 deletions
+1 -1
View File
@@ -13,10 +13,10 @@
#define USEDELAY 16 // For adding extra delay to heavy items, not currently used
#define NOSHIELD 32 // weapon not affected by shield
#define CONDUCT 64 // conducts electricity (metal etc.)
#define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way
#define FPRINT 256 // takes a fingerprint
#define ON_BORDER 512 // item has priority to check when entering or leaving
#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
#define NOBLOODY 65535 // used by objects that don't want to get bloodied
#define GLASSESCOVERSEYES 1024
#define MASKCOVERSEYES 1024 // get rid of some of the other retardation in these flags
+4
View File
@@ -77,3 +77,7 @@
#define TR_KEEPSE 32 // changelings shouldn't edit the DNA's SE when turning into a monkey
#define TR_DEFAULTMSG 64
#define TR_KEEPSRC 128
//Organ stuff, It's here because "Genetics" is the most relevant file for organs
#define ORGAN_ORGANIC 1
#define ORGAN_ROBOTIC 2
+6
View File
@@ -12,6 +12,12 @@
return null
return 0
/proc/get_area_master(O)
var/area/A = get_area(O)
if(A && A.master)
A = A.master
return A
/proc/get_area_name(N) //get area by its name
for(var/area/A in world)
if(A.name == N)
+6 -3
View File
@@ -1,9 +1,12 @@
//Returns the world time in english
proc/worldtime2text()
return "[round(world.time / 36000)+12]:[(world.time / 600 % 60) < 10 ? add_zero(world.time / 600 % 60, 1) : world.time / 600 % 60]"
return gameTimestamp("hh:mm")
proc/time_stamp()
return time2text(world.timeofday, "hh:mm:ss")
proc/time_stamp(var/format = "hh:mm:ss")
return time2text(world.timeofday, format)
proc/gameTimestamp(var/format = "hh:mm:ss") // Get the game time in text
return time2text(world.time - timezoneOffset + 432000, format)
/* Preserving this so future generations can see how fucking retarded some people are
proc/time_stamp()
+14
View File
@@ -1256,3 +1256,17 @@ var/list/WALLITEMS = list(
else
user << "\blue [target] is empty!"
return
proc/check_target_facings(mob/living/initator, mob/living/target)
/*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head.
Given how click code currently works (Nov '13), the initiating mob will be facing the target mob most of the time
That said, this proc should not be used if the change facing proc of the click code is overriden at the same time*/
if(!ismob(target) || target.lying)
//Make sure we are not doing this for things that can't have a logical direction to the players given that the target would be on their side
return
if(initator.dir == target.dir) //mobs are facing the same direction
return 1
if(initator.dir + 4 == target.dir || initator.dir - 4 == target.dir) //mobs are facing each other
return 2
if(initator.dir + 2 == target.dir || initator.dir - 2 == target.dir || initator.dir + 6 == target.dir || initator.dir - 6 == target.dir) //Initating mob is looking at the target, while the target mob is looking in a direction perpendicular to the 1st
return 3
+2
View File
@@ -1,10 +1,12 @@
var/global/obj/effect/overlay/plmaster = null // atmospheric overlay for plasma
var/global/obj/effect/overlay/slmaster = null // atmospheric overlay for sleeping gas
var/admin_notice = null // Admin notice that all clients see when joining the server
// nanomanager, the manager for Nano UIs
var/datum/nanomanager/nanomanager = new()
var/timezoneOffset = 0 // The difference betwen midnight (of the host computer) and 0 world.ticks.
// For FTP requests. (i.e. downloading runtime logs.)
// However it'd be ok to use for accessing attack logs and such too, which are even laggier.
+1 -1
View File
@@ -59,7 +59,7 @@
if(stat || paralysis || stunned || weakened)
return
face_atom(A) // change direction to face what you clicked on
face_atom(A)
if(next_move > world.time) // in the year 2000...
return
+2
View File
@@ -103,3 +103,5 @@
#define ui_iarrowleft "SOUTH-1,11"
#define ui_iarrowright "SOUTH-1,13"
#define ui_lingstingdisplay "1,6:15"
+1
View File
@@ -89,6 +89,7 @@ var/datum/global_hud/global_hud = new()
var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons)
var/obj/screen/lingchemdisplay
var/obj/screen/lingstingdisplay
var/obj/screen/blobpwrdisplay
var/obj/screen/blobhealthdisplay
var/obj/screen/alien_plasma_display
+7 -1
View File
@@ -282,6 +282,12 @@
lingchemdisplay.layer = 20
lingchemdisplay.invisibility = 101
lingstingdisplay = new /obj/screen()
lingstingdisplay.name = "current sting"
lingstingdisplay.screen_loc = ui_lingstingdisplay
lingstingdisplay.layer = 20
lingstingdisplay.invisibility = 101
mymob.blind = new /obj/screen()
mymob.blind.icon = 'icons/mob/screen_full.dmi'
mymob.blind.icon_state = "blackimageoverlay"
@@ -310,7 +316,7 @@
mymob.client.screen = null
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, lingchemdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach )
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.damageoverlay, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep) //, mymob.mach )
mymob.client.screen += adding + hotkeybuttons
inventory_shown = 0;
+7 -1
View File
@@ -142,6 +142,12 @@
lingchemdisplay.layer = 20
lingchemdisplay.invisibility = 101
lingstingdisplay = new /obj/screen()
lingstingdisplay.name = "current sting"
lingstingdisplay.screen_loc = ui_lingstingdisplay
lingstingdisplay.layer = 20
lingstingdisplay.invisibility = 101
mymob.blind = new /obj/screen()
mymob.blind.icon = 'icons/mob/screen_full.dmi'
mymob.blind.icon_state = "blackimageoverlay"
@@ -162,5 +168,5 @@
mymob.client.screen = null
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach )
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.pressure, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, lingchemdisplay, lingstingdisplay) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach )
mymob.client.screen += adding + other
+4 -20
View File
@@ -179,6 +179,10 @@
var/mob/living/carbon/human/H = usr
H.quick_equip()
if("current sting")
var/mob/living/carbon/U = usr
U.unset_sting()
if("resist")
if(isliving(usr))
var/mob/living/L = usr
@@ -201,26 +205,6 @@
usr.hud_used.move_intent.icon_state = "running"
if(istype(usr,/mob/living/carbon/alien/humanoid))
usr.update_icons()
if("m_intent")
if(!usr.m_int)
switch(usr.m_intent)
if("run")
usr.m_int = "13,14"
if("walk")
usr.m_int = "14,14"
if("face")
usr.m_int = "15,14"
else
usr.m_int = null
if("walk")
usr.m_intent = "walk"
usr.m_int = "14,14"
if("face")
usr.m_intent = "face"
usr.m_int = "15,14"
if("run")
usr.m_intent = "run"
usr.m_int = "13,14"
if("Reset Machine")
usr.unset_machine()
if("internal")
+9 -1
View File
@@ -17,8 +17,13 @@
/atom/proc/attack_hand(mob/user as mob)
return
/mob/living/carbon/human/RestrainedClickOn(var/atom/A)
/*
/mob/living/carbon/human/RestrainedClickOn(var/atom/A) ---carbons will handle this
return
*/
/mob/living/carbon/RestrainedClickOn(var/atom/A)
return 0
/mob/living/carbon/human/RangedAttack(var/atom/A)
if(!gloves && !mutations.len) return
@@ -51,6 +56,7 @@
/mob/living/RestrainedClickOn(var/atom/A)
return
/*
Monkeys
*/
@@ -67,6 +73,8 @@
things considerably
*/
/mob/living/carbon/monkey/RestrainedClickOn(var/atom/A)
if(..())
return
if(a_intent != "harm" || !ismob(A)) return
if(istype(wear_mask, /obj/item/clothing/mask/muzzle))
return
+17 -8
View File
@@ -90,16 +90,25 @@ datum/controller/vote
var/list/winners = get_result()
var/text
if(winners.len > 0)
if(winners.len > 1)
text = "<b>Vote Tied Between:</b>\n"
for(var/option in winners)
text += "\t[option]\n"
. = pick(winners)
text += "<b>Vote Result: [.]</b>"
if(question) text += "<b>[question]</b>"
else text += "<b>[capitalize(mode)] Vote</b>"
for(var/i=1,i<=choices.len,i++)
var/votes = choices[choices[i]]
if(!votes) votes = 0
text += "\n<b>[choices[i]]:</b> [votes]"
if(mode != "custom")
if(winners.len > 1)
text = "\n<b>Vote Tied Between:</b>"
for(var/option in winners)
text += "\n\t[option]"
. = pick(winners)
text += "\n<b>Vote Result: [.]</b>"
else
text += "\n<b>Did not vote:</b> [clients.len-voted.len]"
else
text += "<b>Vote Result: Inconclusive - No Votes!</b>"
log_vote(text)
world << "<font color='purple'>[text]</font>"
world << "\n<font color='purple'>[text]</font>"
return .
proc/result()
@@ -167,7 +176,7 @@ datum/controller/vote
if(mode == "custom")
text += "\n[question]"
log_vote(text)
world << "<font color='purple'><b>[text]</b>\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote.</font>"
world << "\n<font color='purple'><b>[text]</b>\nType <b>vote</b> to place your votes.\nYou have [config.vote_period/10] seconds to vote.</font>"
time_remaining = round(config.vote_period/10)
return 1
return 0
+10
View File
@@ -49,6 +49,8 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
var/can_carry = 1 // If the disease allows "carriers".
// if hidden[1] is true, then virus is hidden from medical scanners
// if hidden[2] is true, then virus is hidden from PANDEMIC machine
var/requires = 0
var/list/required_limb = list()
/datum/disease/proc/stage_act()
@@ -141,6 +143,7 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
/datum/disease/proc/process()
if(!holder)
active_diseases -= src
return
@@ -181,6 +184,13 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
/datum/disease/New(var/process=1, var/datum/disease/D)//process = 1 - adding the object to global list. List is processed by master controller.
if(requires == 1)
if(ishuman(affected_mob))
var/mob/living/carbon/human/H = affected_mob
if(!H.getlimb(required_limb))
cure(1)
return
cure_list = list(cure_id) // to add more cures, add more vars to this list in the actual disease's New()
if(process) // Viruses in list are considered active.
active_diseases += src
+8 -13
View File
@@ -7,8 +7,6 @@
*/
#define RANDOM_STARTING_LEVEL 2
var/list/archive_diseases = list()
// The order goes from easy to cure to hard to cure.
@@ -62,7 +60,7 @@ var/list/advance_cures = list(
if(!symptoms || !symptoms.len)
if(!D || !D.symptoms || !D.symptoms.len)
symptoms = GenerateSymptoms()
symptoms = GenerateSymptoms(0, 2)
else
for(var/datum/symptom/S in D.symptoms)
symptoms += new S.type
@@ -136,7 +134,7 @@ var/list/advance_cures = list(
return 0
// Will generate new unique symptoms, use this if there are none. Returns a list of symptoms that were generated.
/datum/disease/advance/proc/GenerateSymptoms(var/type_level_limit = RANDOM_STARTING_LEVEL, var/amount_get = 0)
/datum/disease/advance/proc/GenerateSymptoms(var/level_min, var/level_max, var/amount_get = 0)
var/list/generated = list() // Symptoms we generated.
@@ -144,13 +142,12 @@ var/list/advance_cures = list(
var/list/possible_symptoms = list()
for(var/symp in list_symptoms)
var/datum/symptom/S = new symp
if(S.level <= type_level_limit)
if(S.level >= level_min && S.level <= level_max)
if(!HasSymptom(S))
possible_symptoms += S
if(!possible_symptoms.len)
return
//error("Advance Disease - We weren't able to get any possible symptoms in GenerateSymptoms([type_level_limit], [amount_get])")
return generated
// Random chance to get more than one symptom
var/number_of = amount_get
@@ -159,10 +156,8 @@ var/list/advance_cures = list(
while(prob(20))
number_of += 1
for(var/i = 1; number_of >= i; i++)
var/datum/symptom/S = pick(possible_symptoms)
generated += S
possible_symptoms -= S
for(var/i = 1; number_of >= i && possible_symptoms.len; i++)
generated += pick_n_take(possible_symptoms)
return generated
@@ -269,8 +264,8 @@ var/list/advance_cures = list(
return
// Randomly generate a symptom, has a chance to lose or gain a symptom.
/datum/disease/advance/proc/Evolve(var/level = 2)
var/s = safepick(GenerateSymptoms(level, 1))
/datum/disease/advance/proc/Evolve(var/min_level, var/max_level)
var/s = safepick(GenerateSymptoms(min_level, max_level, 1))
if(s)
AddSymptom(s)
Refresh(1)
+7 -2
View File
@@ -12,12 +12,16 @@
severity = "Medium"
longevity = 1000
hidden = list(0, 1)
requires = 1
required_limb = list(/obj/item/organ/limb/chest)
/datum/disease/appendicitis/stage_act()
..()
switch(stage)
if(1)
if(prob(5)) affected_mob.emote("cough")
if(prob(5))
affected_mob.emote("cough")
if(2)
var/obj/item/organ/appendix/A = affected_mob.getorgan(/obj/item/organ/appendix)
if(A)
@@ -41,4 +45,5 @@
else
affected_mob << "<span class='warning'>You gag as you want to throw up, but there's nothing in your stomach!</span>"
affected_mob.Weaken(10)
affected_mob.adjustToxLoss(3)
affected_mob.adjustToxLoss(3)
+6 -11
View File
@@ -11,9 +11,12 @@
cure_chance = 15//higher chance to cure, since two reagents are required
desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
severity = "Major"
requires = 1
required_limb = list(/obj/item/organ/limb/head)
/datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist
/datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR
..()
switch(stage)
if(2)
if(prob(2))
@@ -35,21 +38,12 @@
affected_mob.updatehealth()
if(prob(2))
affected_mob << "\red Your try to remember something important...but can't."
/* if(prob(10))
affected_mob.adjustToxLoss(3)
affected_mob.updatehealth()
if(prob(2))
affected_mob << "\red Your head hurts." */
if(4)
if(prob(2))
affected_mob.emote("stare")
if(prob(2))
affected_mob.emote("drool")
/* if(prob(15))
affected_mob.adjustToxLoss(4)
affected_mob.updatehealth()
if(prob(2))
affected_mob << "\red Your head hurts." */
if(prob(15) && affected_mob.getBrainLoss()<=98) //shouldn't retard you to death now
affected_mob.adjustBrainLoss(3)
affected_mob.updatehealth()
@@ -64,4 +58,5 @@
affected_mob.emote("snore")
if(prob(15))
affected_mob.stuttering += 3
return
+2 -1
View File
@@ -11,7 +11,8 @@
permeability_mod = 0.75
desc = "Some speculate, that this virus is the cause of Wizard Federation existance. Subjects affected show the signs of mental retardation, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition."
severity = "Major"
requires = 1
required_limb = list(/obj/item/organ/limb/head)
/*
BIRUZ BENNAR
+22 -22
View File
@@ -509,7 +509,7 @@ datum/mind
ticker.mode.update_rev_icons_removed(src)
special_role = null
message_admins("[key_name_admin(usr)] has de-rev'ed [current].")
log_admin("[key_name_admin(usr)] has de-rev'ed [current].")
log_admin("[key_name(usr)] has de-rev'ed [current].")
if("rev")
if(src in ticker.mode.head_revolutionaries)
@@ -524,7 +524,7 @@ datum/mind
ticker.mode.update_rev_icons_added(src)
special_role = "Revolutionary"
message_admins("[key_name_admin(usr)] has rev'ed [current].")
log_admin("[key_name_admin(usr)] has rev'ed [current].")
log_admin("[key_name(usr)] has rev'ed [current].")
if("headrev")
if(src in ticker.mode.revolutionaries)
@@ -550,7 +550,7 @@ datum/mind
ticker.mode.update_rev_icons_added(src)
special_role = "Head Revolutionary"
message_admins("[key_name_admin(usr)] has head-rev'ed [current].")
log_admin("[key_name_admin(usr)] has head-rev'ed [current].")
log_admin("[key_name(usr)] has head-rev'ed [current].")
if("autoobjectives")
ticker.mode.forge_revolutionary_objectives(src)
@@ -600,7 +600,7 @@ datum/mind
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a cultist!</B></FONT>"
memory = ""
message_admins("[key_name_admin(usr)] has de-cult'ed [current].")
log_admin("[key_name_admin(usr)] has de-cult'ed [current].")
log_admin("[key_name(usr)] has de-cult'ed [current].")
if("cultist")
if(!(src in ticker.mode.cult))
ticker.mode.cult += src
@@ -612,7 +612,7 @@ datum/mind
if (istype(cult))
cult.memorize_cult_objectives(src)
message_admins("[key_name_admin(usr)] has cult'ed [current].")
log_admin("[key_name_admin(usr)] has cult'ed [current].")
log_admin("[key_name(usr)] has cult'ed [current].")
if("tome")
var/mob/living/carbon/human/H = current
if (istype(H))
@@ -643,7 +643,7 @@ datum/mind
special_role = null
current.spellremove(current)
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a wizard!</B></FONT>"
log_admin("[key_name_admin(usr)] has de-wizard'ed [current].")
log_admin("[key_name(usr)] has de-wizard'ed [current].")
if("wizard")
if(!(src in ticker.mode.wizards))
ticker.mode.wizards += src
@@ -651,7 +651,7 @@ datum/mind
//ticker.mode.learn_basic_spells(current)
current << "<B>\red You are the Space Wizard!</B>"
message_admins("[key_name_admin(usr)] has wizard'ed [current].")
log_admin("[key_name_admin(usr)] has wizard'ed [current].")
log_admin("[key_name(usr)] has wizard'ed [current].")
if("lair")
current.loc = pick(wizardstart)
if("dressup")
@@ -673,7 +673,7 @@ datum/mind
if(changeling) del(changeling)
current << "<FONT color='red' size = 3><B>You grow weak and lose your powers! You are no longer a changeling and are stuck in your current form!</B></FONT>"
message_admins("[key_name_admin(usr)] has de-changeling'ed [current].")
log_admin("[key_name_admin(usr)] has de-changeling'ed [current].")
log_admin("[key_name(usr)] has de-changeling'ed [current].")
if("changeling")
if(!(src in ticker.mode.changelings))
ticker.mode.changelings += src
@@ -681,7 +681,7 @@ datum/mind
special_role = "Changeling"
current << "<B><font color='red'>Your powers are awoken. A flash of memory returns to us...we are a changeling!</font></B>"
message_admins("[key_name_admin(usr)] has changeling'ed [current].")
log_admin("[key_name_admin(usr)] has changeling'ed [current].")
log_admin("[key_name(usr)] has changeling'ed [current].")
if("autoobjectives")
ticker.mode.forge_changeling_objectives(src)
usr << "\blue The objectives for changeling [key] have been generated. You can edit them and anounce manually."
@@ -707,7 +707,7 @@ datum/mind
objectives-=O
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a syndicate operative!</B></FONT>"
message_admins("[key_name_admin(usr)] has de-nuke op'ed [current].")
log_admin("[key_name_admin(usr)] has de-nuke op'ed [current].")
log_admin("[key_name(usr)] has de-nuke op'ed [current].")
if("nuclear")
if(!(src in ticker.mode.syndicates))
ticker.mode.syndicates += src
@@ -721,7 +721,7 @@ datum/mind
ticker.mode.forge_syndicate_objectives(src)
ticker.mode.greet_syndicate(src)
message_admins("[key_name_admin(usr)] has nuke op'ed [current].")
log_admin("[key_name_admin(usr)] has nuke op'ed [current].")
log_admin("[key_name(usr)] has nuke op'ed [current].")
if("lair")
current.loc = get_turf(locate("landmark*Syndicate-Spawn"))
if("dressup")
@@ -758,7 +758,7 @@ datum/mind
special_role = null
current << "\red <FONT size = 3><B>You have been brainwashed! You are no longer a traitor!</B></FONT>"
message_admins("[key_name_admin(usr)] has de-traitor'ed [current].")
log_admin("[key_name_admin(usr)] has de-traitor'ed [current].")
log_admin("[key_name(usr)] has de-traitor'ed [current].")
if(isAI(current))
var/mob/living/silicon/ai/A = current
A.set_zeroth_law("")
@@ -771,7 +771,7 @@ datum/mind
special_role = "traitor"
current << "<B>\red You are a traitor!</B>"
message_admins("[key_name_admin(usr)] has traitor'ed [current].")
log_admin("[key_name_admin(usr)] has traitor'ed [current].")
log_admin("[key_name(usr)] has traitor'ed [current].")
if(isAI(current))
var/mob/living/silicon/ai/A = current
call(/datum/game_mode/proc/add_law_zero)(A)
@@ -826,7 +826,8 @@ datum/mind
log_admin("[key_name(usr)] attempting to humanize [key_name(current)]")
message_admins("\blue [key_name_admin(usr)] attempting to humanize [key_name_admin(current)]")
H = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG)
src = H.mind
if(H)
src = H.mind
else if (href_list["silicon"])
switch(href_list["silicon"])
@@ -850,12 +851,12 @@ datum/mind
A << "\red <FONT size = 3><B>You have been patched! You are no longer malfunctioning!</B></FONT>"
message_admins("[key_name_admin(usr)] has de-malf'ed [A].")
log_admin("[key_name_admin(usr)] has de-malf'ed [A].")
log_admin("[key_name(usr)] has de-malf'ed [A].")
if("malf")
make_AI_Malf()
message_admins("[key_name_admin(usr)] has malf'ed [current].")
log_admin("[key_name_admin(usr)] has malf'ed [current].")
log_admin("[key_name(usr)] has malf'ed [current].")
if("unemag")
var/mob/living/silicon/robot/R = current
@@ -873,7 +874,7 @@ datum/mind
R.module_state_3 = null
R.contents -= R.module.emag
message_admins("[key_name_admin(usr)] has unemag'ed [R].")
log_admin("[key_name_admin(usr)] has unemag'ed [R].")
log_admin("[key_name(usr)] has unemag'ed [R].")
if("unemagcyborgs")
if (istype(current, /mob/living/silicon/ai))
@@ -893,7 +894,7 @@ datum/mind
R.module_state_3 = null
R.contents -= R.module.emag
message_admins("[key_name_admin(usr)] has unemag'ed [ai]'s Cyborgs.")
log_admin("[key_name_admin(usr)] has unemag'ed [ai]'s Cyborgs.")
log_admin("[key_name(usr)] has unemag'ed [ai]'s Cyborgs.")
else if (href_list["common"])
switch(href_list["common"])
@@ -903,7 +904,7 @@ datum/mind
if("takeuplink")
take_uplink()
memory = null//Remove any memory they may have had.
log_admin("[key_name_admin(usr)] removed [current]'s uplink.")
log_admin("[key_name(usr)] removed [current]'s uplink.")
if("crystals")
if (check_rights(R_FUN, 0))
var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink()
@@ -914,11 +915,11 @@ datum/mind
if (!isnull(crystals))
if (suplink)
suplink.uses = crystals
log_admin("[key_name_admin(usr)] changed [current]'s telecrystal count to [crystals].")
log_admin("[key_name(usr)] changed [current]'s telecrystal count to [crystals].")
if("uplink")
if (!ticker.mode.equip_traitor(current, !(src in ticker.mode.traitors)))
usr << "\red Equipping a syndicate failed!"
log_admin("[key_name_admin(usr)] attempted to give [current] an uplink.")
log_admin("[key_name(usr)] attempted to give [current] an uplink.")
else if (href_list["obj_announce"])
var/obj_count = 1
@@ -1222,4 +1223,3 @@ datum/mind
mind.special_role = "Cultist"
+1 -1
View File
@@ -60,7 +60,7 @@
if(!projectile) // step and step_to sleeps so we'll have to check again.
break
if(!proj_lingering && projectile.loc == current_loc) //if it didn't move since last time
if(!target || (!proj_lingering && projectile.loc == current_loc)) //if it didn't move since last time
del(projectile)
break
+13 -6
View File
@@ -104,7 +104,7 @@ var/list/uplink_items = list()
name = "C-20r Submachine Gun"
desc = "A fully-loaded Scarborough Arms-developed submachine gun that fires 12mm automatic rounds with a 20-round magazine."
item = /obj/item/weapon/gun/projectile/automatic/c20r
cost = 8
cost = 7
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/machinegun
@@ -159,7 +159,7 @@ var/list/uplink_items = list()
desc = "A chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger Cooperative, the deadly blend it comes stocked with will disorient, damage, and disable your foes... \
Use with extreme caution, to prevent exposure to yourself and your fellow operatives."
item = /obj/item/weapon/reagent_containers/spray/chemsprayer/bioterror
cost = 15
cost = 10
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/gygax
@@ -201,7 +201,7 @@ var/list/uplink_items = list()
name = "Ammo-10mm"
desc = "An additional 8-round 10mm magazine for use in the Stetchkin pistol."
item = /obj/item/ammo_box/magazine/m10mm
cost = 2
cost = 1
gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/ammo/machinegun
@@ -241,7 +241,7 @@ var/list/uplink_items = list()
name = "Stetchkin Silencer"
desc = "Fitted for use on the Stetchkin pistol, this silencer will make its shots quieter when equipped onto it."
item = /obj/item/weapon/silencer
cost = 3
cost = 2
gamemodes = list(/datum/game_mode/nuclear)
// STEALTHY TOOLS
@@ -373,11 +373,18 @@ var/list/uplink_items = list()
/datum/uplink_item/device_tools/syndicate_bomb
name = "Syndicate Bomb"
desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 30 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. \
You can wrench the bomb down to prevent removal. The crew may defuse the bomb."
desc = "The Syndicate Bomb has an adjustable timer with a minimum setting of 60 seconds. Ordering the bomb sends you a small beacon, which will teleport the explosive to your location when you activate it. \
You can wrench the bomb down to prevent removal. The crew may attempt to defuse the bomb."
item = /obj/item/device/sbeacondrop/bomb
cost = 5
/datum/uplink_item/device_tools/syndicate_detonator
name = "Syndicate Detonator"
desc = "The Syndicate Detonator is a companion device to the Syndicate Bomb. Simply press the included button and an encrypted radio frequency will instruct all live syndicate bombs to detonate. \
Useful for when speed matters or you wish to synchronize multiple bomb blasts. Be sure to stand clear of the blast radius before using the detonator."
item = /obj/item/device/syndicatedetonator
cost = 1
/datum/uplink_item/device_tools/teleporter
name = "Teleporter Circuit Board"
desc = "A printed circuit board that completes the teleporter onboard the mothership. Advise you test fire the teleporter before entering it, as malfunctions can occur."
+4
View File
@@ -11,6 +11,8 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
/datum/wires/syndicatebomb/UpdatePulsed(var/index)
var/obj/machinery/syndicatebomb/P = holder
if(P.degutted)
return
switch(index)
if(WIRE_BOOM)
if (P.active)
@@ -47,6 +49,8 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
/datum/wires/syndicatebomb/UpdateCut(var/index, var/mended)
var/obj/machinery/syndicatebomb/P = holder
if(P.degutted)
return
switch(index)
if(WIRE_EXPLODE)
if(!mended)
+2
View File
@@ -150,10 +150,12 @@ proc/process_ghost_teleport_locs()
/area/shuttle/escape/centcom
name = "\improper Emergency Shuttle Centcom"
icon_state = "shuttle"
destination = /area/shuttle/escape/station
/area/shuttle/escape/transit // the area to pass through for 3 minute transit
name = "\improper Emergency Shuttle Transit"
icon_state = "shuttle"
destination = /area/shuttle/escape/centcom
/area/shuttle/escape_pod1
+3 -4
View File
@@ -17,9 +17,6 @@
// replaced by OPENCONTAINER flags and atom/proc/is_open_container()
///Chemistry.
//Detective Work, used for the duplicate data points kept in the scanners
var/list/original_atom
/atom/proc/throw_impact(atom/hit_atom)
if(istype(hit_atom,/mob/living))
var/mob/living/M = hit_atom
@@ -244,7 +241,7 @@ var/list/blood_splatter_icons = list()
//returns 1 if made bloody, returns 0 otherwise
/atom/proc/add_blood(mob/living/carbon/M)
if(flags & NOBLOODY)
if(rejects_blood())
return 0
if(!initial(icon) || !initial(icon_state))
return 0
@@ -297,6 +294,8 @@ var/list/blood_splatter_icons = list()
update_inv_gloves() //handles bloody hands overlays and updating
return 1 //we applied blood to the item
/atom/proc/rejects_blood()
return 0
/atom/proc/add_vomit_floor(mob/living/carbon/M as mob, var/toxvomit = 0)
if( istype(src, /turf/simulated) )
-1
View File
@@ -2,7 +2,6 @@
layer = 3
var/last_move = null
var/anchored = 0
// var/elevation = 2 - not used anywhere
var/move_speed = 10
var/l_move_time = 1
var/m_flag = 1
+1 -1
View File
@@ -309,7 +309,7 @@
else
if(istype(M, /mob/living/carbon/monkey)) // monkey > human,
var/mob/living/carbon/human/O = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPVIRUS)
if(connected) //inside dna thing
if(O && connected) //inside dna thing
var/obj/machinery/dna_scannernew/C = connected
O.loc = C
C.occupant = O
@@ -231,6 +231,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/purchasedpowers = list()
var/mimicing = ""
var/canrespec = 0
var/datum/dna/chosen_dna
var/chosen_sting
/datum/changeling/New(var/gender=FEMALE)
..()
@@ -28,6 +28,8 @@
//removes our changeling verbs
/mob/proc/remove_changeling_powers()
var/mob/living/carbon/C = src
C.unset_sting()
for(var/datum/power/changeling/P in powerinstances)
if(P.isVerb)
verbs -= P.verbpath
@@ -179,12 +181,12 @@
O.make_changeling(1)
O.verbs += /mob/living/carbon/proc/changeling_human_form
O.unset_sting()
feedback_add_details("changeling_powers","LF")
. = 1
del(src)
return
//Transform into a human
/mob/living/carbon/proc/changeling_human_form()
@@ -213,7 +215,9 @@
var/mob/living/carbon/human/O = humanize((TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSRC),chosen_dna.real_name)
O.make_changeling()
if(O)
O.make_changeling()
O.unset_sting()
feedback_add_details("changeling_powers","LFT")
. = 1
del(src)
@@ -524,118 +528,113 @@ var/list/datum/dna/hivemind_bank = list()
if(src && src.mind && src.mind.changeling)
src.mind.changeling.mimicing = ""
//////////
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
//////////
/mob/proc/sting_can_reach(mob/M as mob, sting_range = 1)
if(M.loc == src.loc) return 1 //target and source are in the same thing
if(!isturf(src.loc) || !isturf(M.loc)) return 0 //One is inside, the other is outside something.
if(AStar(src.loc, M.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, sting_range)) //If a path exists, good!
/mob/living/carbon/proc/set_sting(A, icon, dna=null) //setting the sting and ui icon for it
src << "<span class='notice'>We prepare our sting, use alt+click on target to sting them.</span>"
src.mind.changeling.chosen_sting = A
if(dna)
src.mind.changeling.chosen_dna = dna
hud_used.lingstingdisplay.icon_state = icon
hud_used.lingstingdisplay.invisibility = 0
/mob/living/carbon/proc/unset_sting() //unsetting the previous
src << "<span class='warning'>We retract our sting, we can't sting anyone for now.</span>"
src.mind.changeling.chosen_sting = null
hud_used.lingstingdisplay.icon_state = null
hud_used.lingstingdisplay.invisibility = 101
/mob/living/carbon/proc/sting_can_reach(mob/living/carbon/C, chem_cost) //handles all the checks there are
if(!isturf(src.loc)) return 0
if(get_dist(src, C) > (src.mind.changeling.sting_range)) return 0 //sanity check as AStar is still throwing insane stunts
if(!AStar(src.loc, C.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, src.mind.changeling.sting_range)) return 0 //hope this ancient magic still works
if(src.mind.changeling.chem_charges < chem_cost)
src << "<span class='warning'>Not enough chemicals.</span>"
return 0
src.mind.changeling.chem_charges -= chem_cost
src << "<span class='notice'>We stealthly sting [C.name].</span>"
if(C.mind && C.mind.changeling)
C << "<span class='warning'>You feel a tiny prick.</span>"
return 0
else
return 1
return 0
//Handles the general sting code to reduce on copypasta (seeming as somebody decided to make SO MANY dumb abilities)
/mob/proc/changeling_sting(var/required_chems=0, var/verb_path)
var/datum/changeling/changeling = changeling_power(required_chems)
if(!changeling) return
var/list/victims = list()
for(var/mob/living/carbon/C in oview(changeling.sting_range))
victims += C
var/mob/living/carbon/T = input(src, "Who will we sting?") as null|anything in victims
if(!T) return
if(!(T in view(changeling.sting_range))) return
if(!sting_can_reach(T, changeling.sting_range)) return
if(!changeling_power(required_chems)) return
changeling.chem_charges -= required_chems
verbs -= verb_path
spawn(5) verbs += verb_path
src << "<span class='notice'>We stealthily sting [T].</span>"
if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting
T << "<span class='warning'>You feel a tiny prick.</span>"
return
/mob/living/carbon/proc/changeling_transformation_sting()
set category = "Changeling"
set name = "Transformation Sting (40)"
set desc= "Transform the target to one of our stored DNAs"
var/datum/changeling/changeling = changeling_power(40)
if(!changeling) return 0
var/list/names = list()
for(var/datum/dna/DNA in changeling.absorbed_dna)
for(var/datum/dna/DNA in mind.changeling.absorbed_dna)
names += DNA.real_name
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
var/datum/dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
var/datum/dna/D = mind.changeling.GetDNA(S)
if(!D)
return
var/mob/living/carbon/T = changeling_sting(40,/mob/living/carbon/proc/changeling_transformation_sting)
if(!T) return 0
set_sting(/mob/living/carbon/proc/sting_effect_trasnform, "sting_transform", D)
/mob/living/carbon/proc/sting_effect_trasnform(mob/living/carbon/T)
if(!sting_can_reach(T, 40))
return 0
if((HUSK in T.mutations) || !check_dna_integrity(T))
src << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
return 0
T.dna = chosen_dna
T.real_name = chosen_dna.real_name
T.dna = src.mind.changeling.chosen_dna
T.real_name = src.mind.changeling.chosen_dna.real_name
updateappearance(T)
domutcheck(T, null)
feedback_add_details("changeling_powers","TS")
return 1
/mob/living/carbon/proc/changeling_extract_dna_sting()
set category = "Changeling"
set name = "Extract DNA Sting (25)"
set desc="Stealthily sting a target to extract their DNA."
var/datum/changeling/changeling = null
if(src.mind && src.mind.changeling)
changeling = src.mind.changeling
if(!changeling)
set_sting(/mob/living/carbon/proc/sting_effect_extract, "sting_extract")
/mob/living/carbon/proc/sting_effect_extract(mob/living/carbon/T)
if(!sting_can_reach(T, 25))
return 0
var/mob/living/carbon/T = changeling_sting(25, /mob/living/carbon/proc/changeling_extract_dna_sting)
if(!T) return 0
if(changeling.can_absorb_dna(T, usr))
changeling.absorb_dna(T, usr)
if(src.mind.changeling.can_absorb_dna(T, usr))
src.mind.changeling.absorb_dna(T, usr)
else//If the sting fails, give the guy most of his chems back.
changeling.chem_charges += 20
src.mind.changeling.chem_charges += 20
feedback_add_details("changeling_powers","ED")
return 1
/mob/living/carbon/proc/changeling_mute_sting()
set category = "Changeling"
set name = "Mute sting (20)"
set desc= "Temporarily mutes the target."
var/mob/living/carbon/T = changeling_sting(20,/mob/living/carbon/proc/changeling_mute_sting)
if(!T) return 0
set_sting(/mob/living/carbon/proc/sting_effect_mute, "sting_mute")
/mob/living/carbon/proc/sting_effect_mute(mob/living/carbon/T)
if(!sting_can_reach(T, 20))
return 0
T.silent += 30
feedback_add_details("changeling_powers","MS")
return 1
/mob/living/carbon/proc/changeling_blind_sting()
set category = "Changeling"
set name = "Blind Sting (25)"
set desc= "Temporarily blinds the target."
var/mob/living/carbon/T = changeling_sting(25,/mob/living/carbon/proc/changeling_blind_sting)
if(!T) return 0
set_sting(/mob/living/carbon/proc/sting_effect_blind, "sting_blind")
/mob/living/carbon/proc/sting_effect_blind(mob/living/carbon/T)
if(!sting_can_reach(T, 25))
return 0
T << "<span class='danger'>Your eyes burn horrifically!</span>"
T.disabilities |= NEARSIGHTED
T.eye_blind = 20
@@ -643,28 +642,31 @@ var/list/datum/dna/hivemind_bank = list()
feedback_add_details("changeling_powers","BS")
return 1
/mob/living/carbon/proc/changeling_lsd_sting()
set category = "Changeling"
set name = "Hallucination Sting (5)"
set desc = "Causes terror in the target."
var/mob/living/carbon/T = changeling_sting(5,/mob/living/carbon/proc/changeling_lsd_sting)
if(!T) return 0
set_sting(/mob/living/carbon/proc/sting_effect_lsd, "sting_lsd")
/mob/living/carbon/proc/sting_effect_lsd(mob/living/carbon/T)
if(!sting_can_reach(T, 5))
return 0
spawn(rand(300,600))
if(T) T.hallucination += 400
feedback_add_details("changeling_powers","HS")
return 1
/mob/living/carbon/proc/changeling_cryo_sting()
set category = "Changeling"
set name = "Cryogenic Sting (15)"
set desc = "Cools the target, slowing them."
var/mob/living/carbon/T = changeling_sting(15,/mob/living/carbon/proc/changeling_cryo_sting)
if(!T) return 0
set_sting(/mob/living/carbon/proc/sting_effect_cryo, "sting_cryo")
/mob/living/carbon/proc/sting_effect_cryo(mob/living/carbon/T)
if(!sting_can_reach(T, 15))
return 0
if(T.reagents)
T.reagents.add_reagent("frostoil", 30)
T.reagents.add_reagent("ice", 30)
+16 -8
View File
@@ -90,29 +90,37 @@
if (href_list["rune"])
switch(href_list["rune"])
if("newtome")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(usr)
usr.put_in_hands(T)
T.imbue = "newtome"
if("teleport")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(usr)
usr.put_in_hands(T)
T.imbue = "[pick("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri", "orkan", "allaq")]"
T.info = "[T.imbue]"
if("emp")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(usr)
usr.put_in_hands(T)
T.imbue = "emp"
if("conceal")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(usr)
usr.put_in_hands(T)
T.imbue = "conceal"
if("communicate")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(usr)
usr.put_in_hands(T)
T.imbue = "communicate"
if("runestun")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(usr)
usr.put_in_hands(T)
T.imbue = "runestun"
if("armor")
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr))
var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(usr)
usr.put_in_hands(T)
T.imbue = "armor"
if("soulstone")
new /obj/item/device/soulstone(get_turf(usr))
var/obj/item/device/soulstone/T = new /obj/item/device/soulstone(usr)
usr.put_in_hands(T)
if("construct")
new /obj/structure/constructshell(get_turf(usr))
src.uses--
@@ -31,7 +31,7 @@
//Triumvirate?
if (ticker.triai == 1)
required_enemies = 3
required_players = max(required_enemies+1, required_players) //to prevent issues if players are set too low
required_players = max(required_enemies+1, required_players) //to prevent issues if players are set too low
return ..()
/datum/game_mode/malfunction/get_players_for_role(var/role = BE_MALF)
@@ -187,6 +187,12 @@
command_alert("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert")
set_security_level("delta")
for(var/obj/item/weapon/pinpointer/point in world)
for(var/datum/mind/AI_mind in ticker.mode.malf_ai)
var/mob/living/silicon/ai/A = AI_mind.current // the current mob the mind owns
if(A.stat != DEAD)
point.the_disk = A //The pinpointer now tracks the AI core.
ticker.mode:malf_mode_declared = 1
for(var/datum/mind/AI_mind in ticker.mode:malf_ai)
AI_mind.current.verbs -= /datum/game_mode/malfunction/proc/takeover
+30 -47
View File
@@ -1,5 +1,3 @@
#define METEOR_TEMPERATURE
/var/const/meteor_wave_delay = 625 //minimum wait between waves in tenths of seconds
//set to at least 100 unless you want evarr ruining every round
@@ -95,37 +93,22 @@
icon_state = "smallf"
pass_flags = PASSTABLE | PASSGRILLE
/obj/effect/meteor/Move()
var/turf/T = src.loc
if (istype(T, /turf))
T.hotspot_expose(METEOR_TEMPERATURE, 1000)
..()
return
/obj/effect/meteor/Bump(atom/A)
spawn(0)
for(var/mob/M in range(10, src))
if(!M.stat && !istype(M, /mob/living/silicon/ai)) //bad idea to shake an ai's view
shake_camera(M, 3, 1)
if (A)
A.meteorhit(src)
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
if (--src.hits <= 0)
if (A)
A.meteorhit(src)
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
if (--src.hits <= 0)
//Prevent meteors from blowing up the singularity's containment.
//Changing emitter and generator ex_act would result in them being bomb and C4 proof.
if(!istype(A,/obj/machinery/power/emitter) && \
!istype(A,/obj/machinery/field/generator) && \
prob(15))
explosion(src.loc, 4, 5, 6, 7, 0)
playsound(src.loc, "explosion", 50, 1)
del(src)
return
//Prevent meteors from blowing up the singularity's containment.
//Changing emitter and generator ex_act would result in them being bomb and C4 proof.
if(!istype(A,/obj/machinery/power/emitter) && \
!istype(A,/obj/machinery/field/generator) && \
prob(15))
explosion(src.loc, 4, 5, 6, 7, 0)
del(src)
/obj/effect/meteor/ex_act(severity)
if (severity < 4)
del(src)
return
@@ -138,26 +121,26 @@
return
Bump(atom/A)
spawn(0)
//Prevent meteors from blowing up the singularity's containment.
//Changing emitter and generator ex_act would result in them being bomb and C4 proof
if(!istype(A,/obj/machinery/power/emitter) && \
!istype(A,/obj/machinery/field/generator))
if(--src.hits <= 0)
del(src) //Dont blow up singularity containment if we get stuck there.
//Prevent meteors from blowing up the singularity's containment.
//Changing emitter and generator ex_act would result in them being bomb and C4 proof
if(!istype(A,/obj/machinery/power/emitter) && \
!istype(A,/obj/machinery/field/generator))
if(--src.hits <= 0)
del(src) //Dont blow up singularity containment if we get stuck there.
for(var/mob/M in range(10, src))
if(!M.stat && !istype(M, /mob/living/silicon/ai)) //bad idea to shake an ai's view
shake_camera(M, 3, 1)
if (A)
explosion(src.loc, 0, 1, 2, 3, 0)
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
if (--src.hits <= 0)
if(prob(15) && !istype(A, /obj/structure/grille))
explosion(src.loc, 1, 2, 3, 4, 0)
playsound(src.loc, "explosion", 50, 1)
del(src)
return
if (A)
for(var/mob/M in player_list)
var/turf/T = get_turf(M)
if(!T || T.z != src.z)
continue
shake_camera(M, 3, get_dist(M.loc, src.loc) > 20 ? 1 : 3)
M.playsound_local(src.loc, 'sound/effects/meteorimpact.ogg', 50, 1, get_rand_frequency(), 10)
explosion(src.loc, 0, 1, 2, 3, 0)
if (--src.hits <= 0)
if(prob(15) && !istype(A, /obj/structure/grille))
explosion(src.loc, 1, 2, 3, 4, 0)
del(src)
/obj/effect/meteor/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/pickaxe))
+24 -39
View File
@@ -7,7 +7,6 @@ var/bomb_set
icon_state = "nuclearbomb0"
density = 1
var/extended = 0.0
var/timeleft = 60.0
var/timing = 0.0
var/r_code = "ADMIN"
@@ -37,9 +36,6 @@ var/bomb_set
/obj/machinery/nuclearbomb/attackby(obj/item/weapon/I as obj, mob/user as mob)
if (istype(I, /obj/item/weapon/disk/nuclear))
if (!src.extended)
user << "<span class='notice'>You have to deploy the bomb first.</span>"
return
usr.drop_item()
I.loc = src
src.auth = I
@@ -51,44 +47,29 @@ var/bomb_set
return src.attack_hand(user)
/obj/machinery/nuclearbomb/attack_hand(mob/user as mob)
if (src.extended)
user.set_machine(src)
var/dat = text("<TT>\nAuth. Disk: <A href='?src=\ref[];auth=1'>[]</A><HR>", src, (src.auth ? "++++++++++" : "----------"))
if (src.auth)
if (src.yes_code)
dat += text("\n<B>Status</B>: []-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] <A href='?src=\ref[];timer=1'>Toggle</A><BR>\nTime: <A href='?src=\ref[];time=-10'>-</A> <A href='?src=\ref[];time=-1'>-</A> [] <A href='?src=\ref[];time=1'>+</A> <A href='?src=\ref[];time=10'>+</A><BR>\n<BR>\nSafety: [] <A href='?src=\ref[];safety=1'>Toggle</A><BR>\nAnchor: [] <A href='?src=\ref[];anchor=1'>Toggle</A><BR>\n", (src.timing ? "Func/Set" : "Functional"), (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src, src, src, src.timeleft, src, src, (src.safety ? "On" : "Off"), src, (src.anchored ? "Engaged" : "Off"), src)
else
dat += text("\n<B>Status</B>: Auth. S2-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] Toggle<BR>\nTime: - - [] + +<BR>\n<BR>\n[] Safety: Toggle<BR>\nAnchor: [] Toggle<BR>\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
user.set_machine(src)
var/dat = text("<TT>\nAuth. Disk: <A href='?src=\ref[];auth=1'>[]</A><HR>", src, (src.auth ? "++++++++++" : "----------"))
if (src.auth)
if (src.yes_code)
dat += text("\n<B>Status</B>: []-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] <A href='?src=\ref[];timer=1'>Toggle</A><BR>\nTime: <A href='?src=\ref[];time=-10'>-</A> <A href='?src=\ref[];time=-1'>-</A> [] <A href='?src=\ref[];time=1'>+</A> <A href='?src=\ref[];time=10'>+</A><BR>\n<BR>\nSafety: [] <A href='?src=\ref[];safety=1'>Toggle</A><BR>\nAnchor: [] <A href='?src=\ref[];anchor=1'>Toggle</A><BR>\n", (src.timing ? "Func/Set" : "Functional"), (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src, src, src, src.timeleft, src, src, (src.safety ? "On" : "Off"), src, (src.anchored ? "Engaged" : "Off"), src)
else
if (src.timing)
dat += text("\n<B>Status</B>: Set-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] Toggle<BR>\nTime: - - [] + +<BR>\n<BR>\nSafety: [] Toggle<BR>\nAnchor: [] Toggle<BR>\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
else
dat += text("\n<B>Status</B>: Auth. S1-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] Toggle<BR>\nTime: - - [] + +<BR>\n<BR>\nSafety: [] Toggle<BR>\nAnchor: [] Toggle<BR>\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
var/message = "AUTH"
if (src.auth)
message = text("[]", src.code)
if (src.yes_code)
message = "*****"
dat += text("<HR>\n>[]<BR>\n<A href='?src=\ref[];type=1'>1</A><A href='?src=\ref[];type=2'>2</A><A href='?src=\ref[];type=3'>3</A><BR>\n<A href='?src=\ref[];type=4'>4</A><A href='?src=\ref[];type=5'>5</A><A href='?src=\ref[];type=6'>6</A><BR>\n<A href='?src=\ref[];type=7'>7</A><A href='?src=\ref[];type=8'>8</A><A href='?src=\ref[];type=9'>9</A><BR>\n<A href='?src=\ref[];type=R'>R</A><A href='?src=\ref[];type=0'>0</A><A href='?src=\ref[];type=E'>E</A><BR>\n</TT>", message, src, src, src, src, src, src, src, src, src, src, src, src)
var/datum/browser/popup = new(user, "nuclearbomb", name, 300, 400)
popup.set_content(dat)
popup.open()
dat += text("\n<B>Status</B>: Auth. S2-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] Toggle<BR>\nTime: - - [] + +<BR>\n<BR>\n[] Safety: Toggle<BR>\nAnchor: [] Toggle<BR>\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
else
user << "<span class='notice'>You have to deploy the bomb first.</span>"
if (src.timing)
dat += text("\n<B>Status</B>: Set-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] Toggle<BR>\nTime: - - [] + +<BR>\n<BR>\nSafety: [] Toggle<BR>\nAnchor: [] Toggle<BR>\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
else
dat += text("\n<B>Status</B>: Auth. S1-[]<BR>\n<B>Timer</B>: []<BR>\n<BR>\nTimer: [] Toggle<BR>\nTime: - - [] + +<BR>\n<BR>\nSafety: [] Toggle<BR>\nAnchor: [] Toggle<BR>\n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off"))
var/message = "AUTH"
if (src.auth)
message = text("[]", src.code)
if (src.yes_code)
message = "*****"
dat += text("<HR>\n>[]<BR>\n<A href='?src=\ref[];type=1'>1</A><A href='?src=\ref[];type=2'>2</A><A href='?src=\ref[];type=3'>3</A><BR>\n<A href='?src=\ref[];type=4'>4</A><A href='?src=\ref[];type=5'>5</A><A href='?src=\ref[];type=6'>6</A><BR>\n<A href='?src=\ref[];type=7'>7</A><A href='?src=\ref[];type=8'>8</A><A href='?src=\ref[];type=9'>9</A><BR>\n<A href='?src=\ref[];type=R'>R</A><A href='?src=\ref[];type=0'>0</A><A href='?src=\ref[];type=E'>E</A><BR>\n</TT>", message, src, src, src, src, src, src, src, src, src, src, src, src)
var/datum/browser/popup = new(user, "nuclearbomb", name, 300, 400)
popup.set_content(dat)
popup.open()
return
/obj/machinery/nuclearbomb/verb/make_deployable()
set category = "Object"
set name = "Deploy Bomb"
set src in oview(1)
if(isliving(usr))
if(!src.extended)
src.anchored = 1
flick("nuclearbombc", src)
src.icon_state = "nuclearbomb1"
src.extended = 1
/obj/machinery/nuclearbomb/Topic(href, href_list)
if(..())
return
@@ -143,11 +124,15 @@ var/bomb_set
bomb_set = 0
if (href_list["safety"])
src.safety = !( src.safety )
src.icon_state = "nuclearbomb1"
if(safety)
src.timing = 0
bomb_set = 0
if (href_list["anchor"])
src.anchored = !( src.anchored )
if(!isinspace())
src.anchored = !( src.anchored )
else
usr << "<span class='warning'>There is nothing to anchor to!</span>"
src.add_fingerprint(usr)
for(var/mob/M in viewers(1, src))
if ((M.client && M.machine == src))
+27 -16
View File
@@ -26,12 +26,12 @@ datum/hSB
var/objinfo = null
var/canisterinfo = null
var/hsbinfo = null
//items that shouldn't spawn on the floor because they would bug or act weird
var/global/list/spawn_forbidden = list(
/obj/item/weapon/grab, /obj/item/tk_grab, /obj/item/weapon/implant, // not implanter, the actual thing that is inside you
/obj/item/assembly,/obj/item/device/onetankbomb, /obj/item/radio, /obj/item/device/pda/ai,
/obj/item/device/uplink/hidden, /obj/item/smallDelivery, /obj/item/missile,/obj/item/projectile,
/obj/item/borg/sight,/obj/item/borg/overdrive,/obj/item/borg/stun)
/obj/item/borg/sight,/obj/item/borg/overdrive,/obj/item/borg/stun,/obj/item/weapon/robot_module)
proc
update()
@@ -49,25 +49,31 @@ datum/hSB
"Spawn All-Access ID" = "hsbaaid",
"Building Supplies",
"Spawn 50 Wood" = "hsbwood",
"Spawn 50 Metal" = "hsbmetal",
"Spawn 50 Plasteel" = "hsbplasteel",
"Spawn 50 Reinforced Glass" = "hsbrglass",
"Spawn 50 Glass" = "hsbglass",
"Spawn Full Cable Coil" = "hsbspawn&path=[/obj/item/weapon/cable_coil]",
"Spawn Hyper Capacity Power Cell" = "hsbspawn&path=[/obj/item/weapon/cell/hyper]",
"Spawn Inf. Capacity Power Cell" = "hsbspawn&path=[/obj/item/weapon/cell/infinite]",
"Spawn Rapid Construction Device" = "hsbrcd",
"Spawn RCD Ammo" = "hsb_safespawn&path=[/obj/item/weapon/rcd_ammo]",
"Spawn Airlock" = "hsbairlock",
"Miscellaneous",
"Spawn Air Scrubber" = "hsbscrubber",
"Spawn Canister..." = "hsbcanister",
"Spawn Welding Fuel Tank" = "hsbspawn&path=[/obj/structure/reagent_dispensers/fueltank]",
"Spawn Water Tank" = "hsbspawn&path=[/obj/structure/reagent_dispensers/watertank]",
"Bots",
"Spawn Cleanbot" = "hsbspawn&path=[/obj/machinery/bot/cleanbot]",
"Spawn Floorbot" = "hsbspawn&path=[/obj/machinery/bot/floorbot]",
"Spawn Medbot" = "hsbspawn&path=[/obj/machinery/bot/medbot]")
"Spawn Medbot" = "hsbspawn&path=[/obj/machinery/bot/medbot]",
"Canisters",
"Spawn O2 Canister" = "hsbspawn&path=[/obj/machinery/portable_atmospherics/canister/oxygen]",
"Spawn Air Canister" = "hsbspawn&path=[/obj/machinery/portable_atmospherics/canister/air]")
if(!hsbinfo)
@@ -75,9 +81,15 @@ datum/hSB
if(admin)
hsbinfo += "<b>Administration</b><br>"
hsbinfo += "- <a href='?src=\ref[src];hsb=hsbtobj'>Toggle Object Spawning</a><br>"
hsbinfo += "- <a href='?src=\ref[src];hsb=hsbtac'>Toggle Item Spawn Panel Auto-close</a><hr>"
hsbinfo += "- <a href='?src=\ref[src];hsb=hsbtac'>Toggle Item Spawn Panel Auto-close</a><br>"
hsbinfo += "<b>Canister Spawning</b><br>"
hsbinfo += "- <a href='?src=\ref[src];hsb=hsbspawn&path=[/obj/machinery/portable_atmospherics/canister/toxins]'>Spawn Plasma Canister</a><br>"
hsbinfo += "- <a href='?src=\ref[src];hsb=hsbspawn&path=[/obj/machinery/portable_atmospherics/canister/carbon_dioxide]'>Spawn CO2 Canister</a><br>"
hsbinfo += "- <a href='?src=\ref[src];hsb=hsbspawn&path=[/obj/machinery/portable_atmospherics/canister/nitrogen]'>Spawn Nitrogen Canister</a><br>"
hsbinfo += "- <a href='?src=\ref[src];hsb=hsbspawn&path=[/obj/machinery/portable_atmospherics/canister/sleeping_agent]'>Spawn N2O Canister</a><hr>"
else
hsbinfo += "<i>Some item spawning may be disabled by the administrators.</i><br>"
hsbinfo += "<i>Only administrators may spawn dangerous canisters.</i><br>"
for(var/T in hrefs)
var/href = hrefs[T]
if(href)
@@ -124,7 +136,6 @@ datum/hSB
world << "<b>\red Sandbox: \black [usr.key] has added a limiter to object spawning. The window will now auto-close after use.</b>"
config.sandbox_autoclose = 1
return
//
// Spacesuit with full air jetpack set as internals
//
@@ -167,6 +178,13 @@ datum/hSB
var/obj/hsb = new/obj/machinery/portable_atmospherics/scrubber{volume_rate=50*ONE_ATMOSPHERE;on=1}(usr.loc)
hsb.update_icon() // hackish but it wasn't meant to be spawned I guess?
//
// Stacked Materials
//
if("hsbrglass")
new/obj/item/stack/sheet/rglass{amount=50}(usr.loc)
if("hsbmetal")
new/obj/item/stack/sheet/metal{amount=50}(usr.loc)
@@ -176,6 +194,9 @@ datum/hSB
if("hsbglass")
new/obj/item/stack/sheet/glass{amount=50}(usr.loc)
if("hsbwood")
new/obj/item/stack/sheet/wood{amount=50}(usr.loc)
//
// All access ID
//
@@ -201,16 +222,6 @@ datum/hSB
if("hsbairlock")
new /datum/airlock_maker(usr.loc)
//
// Canister select window
//
if("hsbcanister")
if(!canisterinfo)
canisterinfo = "Choose a canister type:<hr>"
for(var/O in (typesof(/obj/machinery/portable_atmospherics/canister/) - /obj/machinery/portable_atmospherics/canister/))
canisterinfo += "<a href='?src=\ref[src];hsb=hsbspawn&path=[O]'>[O]</a><br>"
usr << browse(canisterinfo,"window=sandbox")
//
// Object spawn window
//
+11 -8
View File
@@ -47,7 +47,7 @@
..() // Give them standard objectives.
return
/datum/game_mode/traitor/double_agents/add_latejoin_traitor(var/mob/living/carbon/human/character)
/datum/game_mode/traitor/double_agents/add_latejoin_traitor(var/datum/mind/character)
check_potential_agents()
@@ -60,14 +60,15 @@
// Basically setting the target_list for who is killing who
var/i = 0
for(var/mob/living/carbon/human/traitor in late_joining_list)
for(var/datum/mind/traitor in late_joining_list)
i++
if(i + 1 > late_joining_list.len)
i = 0
target_list[traitor] = late_joining_list[i + 1]
traitor.special_role = traitor_name
// Now, give them their targets
for(var/mob/living/carbon/human/traitor in late_joining_list)
for(var/datum/mind/traitor in target_list)
..(traitor)
late_joining_list = list()
@@ -78,11 +79,13 @@
/datum/game_mode/traitor/double_agents/proc/check_potential_agents()
for(var/M in late_joining_list)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.stat != DEAD)
if(H.client)
continue // It all checks out.
if(istype(M, /datum/mind))
var/datum/mind/agent_mind = M
if(ishuman(agent_mind.current))
var/mob/living/carbon/human/H = agent_mind.current
if(H.stat != DEAD)
if(H.client)
continue // It all checks out.
// If any check fails, remove them from our list
late_joining_list -= M
+3 -3
View File
@@ -80,11 +80,11 @@
if(character.client.prefs.be_special & BE_TRAITOR)
if(!jobban_isbanned(character.client, "traitor") && !jobban_isbanned(character.client, "Syndicate"))
if(!(character.job in ticker.mode.restricted_jobs))
add_latejoin_traitor(character)
add_latejoin_traitor(character.mind)
..()
/datum/game_mode/traitor/proc/add_latejoin_traitor(var/mob/living/carbon/human/character)
character.mind.make_Traitor()
/datum/game_mode/traitor/proc/add_latejoin_traitor(var/datum/mind/character)
character.make_Traitor()
/datum/game_mode/proc/forge_traitor_objectives(var/datum/mind/traitor)
@@ -95,8 +95,8 @@
C.auto_turn()
C.network = tempnetwork
C.c_tag = "[get_area_name(src)] ([rand(1, 999)]"
var/area/A = get_area_master(src)
C.c_tag = "[A.name] ([rand(1, 999)]"
for(var/i = 5; i >= 0; i -= 1)
var/direct = input(user, "Direction?", "Assembling Camera", null) in list("LEAVE IT", "NORTH", "EAST", "SOUTH", "WEST" )
@@ -252,13 +252,14 @@
for(var/obj/effect/landmark/L in linkedholodeck)
if(L.name=="Atmospheric Test Start")
spawn(20)
var/turf/T = get_turf(L)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, T)
s.start()
if(T)
T.temperature = 5000
T.hotspot_expose(50000,50000,1)
if(istype(target,/area/holodeck/source_burntest))
var/turf/T = get_turf(L)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(2, 1, T)
s.start()
if(T)
T.temperature = 5000
T.hotspot_expose(50000,50000,1)
if(L.name=="Holocarp Spawn")
new /mob/living/simple_animal/hostile/carp(L.loc)
+15 -4
View File
@@ -175,10 +175,21 @@
anchored = 1
state = 20//So it doesn't interact based on the above. Not really necessary.
attackby(var/obj/item/device/aicard/A as obj, var/mob/user as mob)
if(istype(A, /obj/item/device/aicard))//Is it?
A.transfer_ai("INACTIVE","AICARD",src,user)
return
/obj/structure/AIcore/deactivated/attackby(var/obj/item/A as obj, var/mob/user as mob)
if(istype(A, /obj/item/device/aicard))//Is it?
A.transfer_ai("INACTIVE","AICARD",src,user)
if(istype(A, /obj/item/weapon/wrench))
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
switch(anchored)
if(0)
if(do_after(user, 20))
user << "\blue You wrench the core into place."
anchored = 1
if(1)
if(do_after(user, 20))
user << "\blue You unfasten the core."
anchored = 0
return
/*
This is a good place for AI-related object verbs so I'm sticking it here.
+1 -1
View File
@@ -154,7 +154,7 @@
new /obj/effect/spawner/newbomb/timer/syndicate(src.loc)
new /obj/item/clothing/head/collectable/petehat(src.loc)
message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
log_game("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.")
log_game("[key_name(usr)] has outbombed Cuban Pete and been awarded a bomb.")
src.New()
emagged = 0
else if(!contents.len)
+16 -8
View File
@@ -160,21 +160,21 @@
var/target_owner
var/target_rank
if(modify)
target_name = modify.name
target_name = html_encode(modify.name)
else
target_name = "--------"
if(modify && modify.registered_name)
target_owner = modify.registered_name
target_owner = html_encode(modify.registered_name)
else
target_owner = "--------"
if(modify && modify.assignment)
target_rank = modify.assignment
target_rank = html_encode(modify.assignment)
else
target_rank = "Unassigned"
var/scan_name
if(scan)
scan_name = scan.name
scan_name = html_encode(scan.name)
else
scan_name = "--------"
@@ -323,9 +323,12 @@
if (authenticated)
var/t1 = href_list["assign_target"]
if(t1 == "Custom")
var/temp_t = copytext(sanitize(input("Enter a custom job assignment.","Assignment")),1,MAX_NAME_LEN)
if(temp_t)
t1 = temp_t
var/newJob = reject_bad_name(input("Enter a custom job assignment.", "Assignment", modify ? modify.assignment : "Unassigned"))
if(newJob)
t1 = newJob
else
usr << "\red Invalid job name entered."
return
else
var/datum/job/jobdatum
for(var/jobtype in typesof(/datum/job))
@@ -345,7 +348,12 @@
var/t2 = modify
//var/t1 = input(usr, "What name?", "ID computer", null) as text
if ((authenticated && modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf)))
modify.registered_name = copytext(sanitize(href_list["reg"]),1,MAX_NAME_LEN)
var/newName = reject_bad_name(href_list["reg"])
if(newName)
modify.registered_name = newName
else
usr << "\red Invalid name entered."
return
if ("mode")
mode = text2num(href_list["mode_target"])
+3 -3
View File
@@ -325,10 +325,10 @@
if (subject.suiciding == 1)
scantemp = "<font class='bad'>Subject's brain is not responding to scanning stimuli.</font>"
return
if ((!subject.ckey) || (!subject.client))
scantemp = "<font class='bad'>Mental interface failure.</font>"
return
if (NOCLONE in subject.mutations)
scantemp = "<font class='bad'>Subject no longer contains the fundamental materials required to create a living clone.</font>"
return
if ((!subject.ckey) || (!subject.client))
scantemp = "<font class='bad'>Mental interface failure.</font>"
return
if (find_record("ckey", subject.ckey, records))
+1 -1
View File
@@ -160,7 +160,7 @@
else
message_admins("\blue [key_name_admin(usr)] detonated [R.name]!")
log_game("\blue [key_name_admin(usr)] detonated [R.name]!")
log_game("\blue [key_name(usr)] detonated [R.name]!")
R.self_destruct()
else
usr << "\red Access Denied."
+5 -6
View File
@@ -26,7 +26,7 @@
bulb = new /obj/item/device/flash(src)
/obj/machinery/flasher/power_change()
if (powered() && bulb && anchored)
if (powered() && anchored && bulb)
stat &= ~NOPOWER
if(bulb.broken)
icon_state = "[base_state]1-p"
@@ -131,15 +131,14 @@
if (!anchored && !isinspace())
user << "<span class='notice'>[src] is now secured.</span>"
overlays.Cut()
power_change()
overlays += "[base_state]-s"
anchored = 1
power_change()
else
user << "<span class='notice'>[src] can now be moved.</span>"
overlays += "[base_state]-s"
power_change()
overlays.Cut()
anchored = 0
power_change()
else
..()
+1 -1
View File
@@ -288,4 +288,4 @@
/obj/machinery/smartfridge/chemistry/virology
name = "smart virus storage"
desc = "A refrigerated storage unit for volatile sample storage."
spawn_meds = list(/obj/item/weapon/reagent_containers/syringe/antiviral = 4, /obj/item/weapon/reagent_containers/glass/bottle/cold = 1, /obj/item/weapon/reagent_containers/glass/bottle/flu_virion = 1, /obj/item/weapon/reagent_containers/glass/bottle/mutagen = 1, /obj/item/weapon/reagent_containers/glass/bottle/synaptizine = 1)
spawn_meds = list(/obj/item/weapon/reagent_containers/syringe/antiviral = 4, /obj/item/weapon/reagent_containers/glass/bottle/cold = 1, /obj/item/weapon/reagent_containers/glass/bottle/flu_virion = 1, /obj/item/weapon/reagent_containers/glass/bottle/mutagen = 1, /obj/item/weapon/reagent_containers/glass/bottle/plasma = 1, /obj/item/weapon/reagent_containers/glass/bottle/synaptizine = 1)
+6
View File
@@ -30,6 +30,7 @@ var/const/SAFETY_COOLDOWN = 100
..()
update_icon()
/*
/obj/machinery/recycler/attackby(var/obj/item/I, var/mob/user)
if(istype(I, /obj/item/weapon/card/emag) && !emagged)
emagged = 1
@@ -37,8 +38,13 @@ var/const/SAFETY_COOLDOWN = 100
safety_mode = 0
update_icon()
playsound(src.loc, "sparks", 75, 1, -1)
else if(istype(I, /obj/item/weapon/screwdriver) && emagged)
emagged = 0
update_icon()
user << "<span class='notice'>You reset the crusher to its default factory settings.</span>"
else
..()
*/
/obj/machinery/recycler/update_icon()
..()
+91 -9
View File
@@ -14,6 +14,7 @@
var/open_panel = 0 //are the wires exposed?
var/active = 0 //is the bomb counting down?
var/defused = 0 //is the bomb capable of exploding?
var/degutted = 0 //is the bomb even a bomb anymore?
/obj/machinery/syndicatebomb/process()
if(active && !defused && (timer > 0)) //Tick Tock
@@ -68,14 +69,37 @@
user << "<span class='notice'>You [open_panel ? "open" : "close"] the wire panel.</span>"
else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler ))
if(open_panel)
if(degutted)
user << "<span class='notice'>The wires aren't connected to anything!<span>"
else if(open_panel)
wires.Interact(user)
else if(istype(I, /obj/item/weapon/crowbar))
if(open_panel && !degutted && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE))
user << "<span class='notice'>You carefully pry out the bomb's payload.</span>"
degutted = 1
new /obj/item/weapon/syndicatebombcore(user.loc)
else if (open_panel)
user << "<span class='notice'>The wires conneting the shell to the explosives are holding it down!</span>"
else if (degutted)
user << "<span class='notice'>The explosives have already been removed.</span>"
else
user << "<span class='notice'>The cover is screwed on, it won't pry off!</span>"
else if(istype(I, /obj/item/weapon/syndicatebombcore))
if(degutted)
user << "<span class='notice'>You place the payload into the shell.</span>"
degutted = 0
user.drop_item()
del(I)
else
user << "<span class='notice'>While a double strength bomb would surely be a thing of terrible beauty, there's just no room for it.</span>"
else
..()
/obj/machinery/syndicatebomb/attack_hand(var/mob/user)
if(anchored)
if(degutted)
user << "<span class='notice'>The bomb's explosives have been removed, the [open_panel ? "wires" : "buttons"] are useless now.</span>"
else if(anchored)
if(open_panel)
wires.Interact(user)
else if(!active)
@@ -87,26 +111,84 @@
/obj/machinery/syndicatebomb/proc/settings(var/mob/user)
var/newtime = input(usr, "Please set the timer.", "Timer", "[timer]") as num
newtime = Clamp(newtime, 30, 60000)
newtime = Clamp(newtime, 60, 60000)
if(in_range(src, usr) && isliving(usr)) //No running off and setting bombs from across the station
timer = newtime
src.loc.visible_message("\blue \icon[src] timer set for [timer] seconds.")
if(alert(usr,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, usr) && isliving(usr))
if(defused || active)
if(defused)
if(defused || active || degutted)
if(degutted)
src.loc.visible_message("\blue \icon[src] Device error: Payload missing")
else if(defused)
src.loc.visible_message("\blue \icon[src] Device error: User intervention required")
return
else
src.loc.visible_message("\red \icon[src] [timer] seconds until detonation, please clear the area.")
playsound(loc, 'sound/machines/click.ogg', 30, 1)
icon_state = "syndicate-bomb-active"
if(!open_panel)
icon_state = "syndicate-bomb-active"
else
icon_state = "syndicate-bomb-active-wires"
active = 1
add_fingerprint(user)
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
var/log_str = "[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>."
message_admins("[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
log_game("[key_name(usr)] has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
processing_objects.Add(src) //Ticking down
/obj/machinery/syndicatebomb/proc/isWireCut(var/index)
return wires.IsIndexCut(index)
/obj/item/weapon/syndicatebombcore
name = "bomb payload"
desc = "A powerful secondary explosive of syndicate design and unknown composition, it should be stable under normal conditions..."
icon = 'icons/obj/assemblies.dmi'
icon_state = "bombcore"
item_state = "eshield0"
flags = FPRINT | TABLEPASS
w_class = 3.0
origin_tech = "syndicate=6;combat=5"
/obj/item/weapon/syndicatebombcore/ex_act(severity) //Little boom can chain a big boom
explosion(src.loc,2,5,11, flame_range = 11)
del(src)
/obj/item/device/syndicatedetonator
name = "big red button"
desc = "Nothing good can come of pressing a button this garish..."
icon = 'icons/obj/assemblies.dmi'
icon_state = "bigred"
item_state = "electronic"
flags = FPRINT | TABLEPASS
w_class = 1.0
origin_tech = "syndicate=2"
var/cooldown = 0
var/detonated = 0
var/existant = 0
/obj/item/device/syndicatedetonator/attack_self(mob/user as mob)
if(!cooldown)
for(var/obj/machinery/syndicatebomb/B in machines)
if(B.active)
B.timer = 0
detonated++
existant++
playsound(user, 'sound/machines/click.ogg', 20, 1)
user << "<span class='notice'>[existant] found, [detonated] triggered.</span>"
if(detonated)
var/turf/T = get_turf(src)
var/area/A = get_area(T)
detonated--
var/log_str = "[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[A.name] (JMP)</a>."
bombers += log_str
message_admins(log_str)
log_game(log_str)
processing_objects.Add(src) //Ticking down
log_game("[key_name(usr)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name]([T.x],[T.y],[T.z])")
detonated = 0
existant = 0
cooldown = 1
spawn(30) cooldown = 0
+8 -8
View File
@@ -112,28 +112,28 @@
var/to_restock = 0
for(var/datum/data/vending_product/machine_content in machine)
if(machine_content.amount == 0 && refill.charges > 0)
machine_content.amount++
refill.charges--
total++
to_restock += machine_content.max_amount - machine_content.amount
if(to_restock <= refill.charges)
for(var/datum/data/vending_product/machine_content in machine)
if(machine_content.amount != machine_content.max_amount)
usr << "<span class='notice'>[machine_content.max_amount - machine_content.amount] of [machine_content.product_name]</span>"
machine_content.amount = machine_content.max_amount
machine_content.amount = machine_content.max_amount
refill.charges -= to_restock
total = to_restock
total += to_restock
else
var/tmp_charges = refill.charges
for(var/datum/data/vending_product/machine_content in machine)
if(refill.charges == 0)
break
var/restock = Ceiling(((machine_content.max_amount - machine_content.amount)/to_restock)*tmp_charges)
if(restock > refill.charges)
restock = refill.charges
machine_content.amount += restock
refill.charges -= restock
total += restock
if(restock)
usr << "<span class='notice'>[restock] of [machine_content.product_name]</span>"
if(refill.charges == 0) //due to rounding, we ran out of refill charges, exit.
break
return total
+6 -9
View File
@@ -349,16 +349,13 @@
do_after_cooldown()
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve
name = "\improper SOP-6 grenade launcher"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve //Heartless? for making the poor man's honkblast? - Kaze
name = "\improper SOB-3 grenade launcher"
projectiles = 3
projectile = /obj/item/weapon/grenade/flashbang/clusterbang
construction_cost = list("metal"=20000,"gold"=6000,"uranium"=6000)
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/get_equip_info()//Limited version of the clusterbang launcher that can't reload
return "<span style=\"color:[equip_ready?"#0f0":"#f00"];\">*</span>&nbsp;[chassis.selected==src?"<b>":"<a href='?src=\ref[chassis];select_equip=\ref[src]'>"][src.name][chassis.selected==src?"</b>":"</a>"]\[[src.projectiles]\]"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/rearm()
return//Extra bit of security
projectile_energy_cost = 1600 //getting off cheap seeing as this is 3 times the flashbangs held in the grenade launcher.
equip_cooldown = 90
construction_cost = list("metal"=20000,"gold"=10000,"uranium"=10000) //now as expensive as a Honkblast.
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar
name = "banana mortar"
+1 -1
View File
@@ -367,7 +367,7 @@
src.overlays -= "fab-active"
src.desc = initial(src.desc)
if(being_built)
src.being_built.Move(get_step(src,SOUTH))
src.being_built.loc = get_step(src,SOUTH)
src.visible_message("\icon[src] <b>[src]</b> beeps, \"The [src.being_built] is complete\".")
src.being_built = null
src.updateUsrDialog()
+3 -1
View File
@@ -42,7 +42,7 @@
/obj/structure/alien/resin/CanAtmosPass()
return !density
/obj/structure/alien/resin/wall
name = "resin wall"
desc = "Purple slime solidified into a wall."
@@ -140,6 +140,7 @@
#define NODERANGE 3
/obj/structure/alien/weeds
gender = PLURAL
name = "weeds"
desc = "Weird purple weeds."
icon_state = "weeds"
@@ -376,6 +377,7 @@
* Acid
*/
/obj/effect/acid
gender = PLURAL
name = "acid"
desc = "Burbling corrossive stuff."
icon = 'icons/effects/effects.dmi'
+6 -11
View File
@@ -1,23 +1,18 @@
/obj/effect/decal/remains/human
/obj/effect/decal/remains
name = "remains"
desc = "They look like human remains. They have a strange aura about them."
gender = PLURAL
icon = 'icons/effects/blood.dmi'
icon_state = "remains"
anchored = 1
/obj/effect/decal/remains/human
desc = "They look like human remains. They have a strange aura about them."
icon_state = "remains"
/obj/effect/decal/remains/xeno
name = "remains"
desc = "They look like the remains of something... alien. They have a strange aura about them."
gender = PLURAL
icon = 'icons/effects/blood.dmi'
icon_state = "remainsxeno"
anchored = 1
/obj/effect/decal/remains/robot
name = "remains"
desc = "They look like the remains of something mechanical. They have a strange aura about them."
gender = PLURAL
icon = 'icons/mob/robots.dmi'
icon_state = "remainsrobot"
anchored = 1
icon_state = "remainsrobot"
+2 -1
View File
@@ -914,7 +914,8 @@ steam.start() -- spawns the effect
anchored = 1
name = "foamed metal"
desc = "A lightweight foamed metal wall."
var/metal = 1 // 1=aluminum, 2=iron
gender = PLURAL
var/metal = 1 // 1=aluminium, 2=iron
New()
..()
+6 -6
View File
@@ -1,5 +1,5 @@
/obj/effect/mine
name = "Mine"
name = "mine"
desc = "I Better stay away from that thing."
density = 1
anchored = 1
@@ -69,26 +69,26 @@
del(src)
/obj/effect/mine/dnascramble
name = "Radiation Mine"
name = "radiation mine"
icon_state = "uglymine"
triggerproc = "triggerrad"
/obj/effect/mine/plasma
name = "Plasma Mine"
name = "plasma mine"
icon_state = "uglymine"
triggerproc = "triggerplasma"
/obj/effect/mine/kick
name = "Kick Mine"
name = "kick mine"
icon_state = "uglymine"
triggerproc = "triggerkick"
/obj/effect/mine/n2o
name = "N2O Mine"
name = "\improper N2O mine"
icon_state = "uglymine"
triggerproc = "triggern2o"
/obj/effect/mine/stun
name = "Stun Mine"
name = "stun mine"
icon_state = "uglymine"
triggerproc = "triggerstun"
+20 -11
View File
@@ -99,20 +99,29 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
else if(dist < light_impact_range) dist = 3
else dist = 0
if(flame_dist && prob(40) && !istype(T, /turf/space))
new /obj/effect/hotspot(T) //Mostly for ambience!
hotspot_exists = 1
if(dist)
T.ex_act(dist)
//------- TURF FIRES -------\\
if(T)
if(flame_dist && prob(40) && !istype(T, /turf/space))
new/obj/effect/hotspot(T) //Mostly for ambience!
hotspot_exists = 1
if(dist)
T.ex_act(dist)
//------- THINGS IN TURFS FIRES -------\\
for(var/atom_movable in T.contents) //bypass type checking since only atom/movable can be contained by turfs anyway
var/atom/movable/AM = atom_movable
if(flame_dist)
if(isliving(AM) && !hotspot_exists && !istype(T, /turf/space))
new /obj/effect/hotspot(AM.loc)
//Just in case we missed a mob while they were in flame_range, but a hotspot didn't spawn on them, otherwise it looks weird when you just burst into flame out of nowhere
if(dist)
AM.ex_act(dist)
if(AM) //Something is inside T (We have already checked T exists above) - RR
if(flame_dist) //if it has flame distance, run this - RR
if(isliving(AM) && !hotspot_exists && !istype(T, /turf/space))
new /obj/effect/hotspot(AM.loc)
//Just in case we missed a mob while they were in flame_range, but a hotspot didn't spawn on them, otherwise it looks weird when you just burst into flame out of nowhere
if(dist) //if no flame_dist, run this - RR
AM.ex_act(dist)
var/took = (world.timeofday-start)/10
//You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare
+5 -2
View File
@@ -1,7 +1,6 @@
/obj/item
name = "item"
icon = 'icons/obj/items.dmi'
var/abstract = 0
var/item_state = null
var/r_speed = 1.0
var/health = null
@@ -180,19 +179,23 @@
if(istype(W,/obj/item/weapon/storage))
var/obj/item/weapon/storage/S = W
if(S.use_to_pickup)
if(S.collection_mode) //Mode is set to collect all items on a tile and we clicked on a valid one.
if(S.collection_mode) //Mode is set to collect multiple items on a tile and we clicked on a valid one.
if(isturf(src.loc))
var/list/rejections = list()
var/success = 0
var/failure = 0
for(var/obj/item/I in src.loc)
if(S.collection_mode == 2 && !istype(I,src.type)) // We're only picking up items of the target type
failure = 1
continue
if(I.type in rejections) // To limit bag spamming: any given type only complains once
continue
if(!S.can_be_inserted(I)) // Note can_be_inserted still makes noise when the answer is no
rejections += I.type // therefore full bags are still a little spammy
failure = 1
continue
success = 1
S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
if(success && !failure)
+1 -1
View File
@@ -1,7 +1,7 @@
// APC HULL
/obj/item/apc_frame
name = "APC frame"
name = "\improper APC frame"
desc = "Used for repairing or building APCs"
icon = 'icons/obj/apc_repair.dmi'
icon_state = "apc_frame"
+1 -1
View File
@@ -1,5 +1,5 @@
/obj/item/blueprints
name = "station blueprints"
name = "\proper the station blueprints"
desc = "Blueprints of the station. There's stamp \"Classified\" and several coffee stains on it."
icon = 'icons/obj/items.dmi'
icon_state = "blueprints"
+1 -1
View File
@@ -133,7 +133,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/syndicate
default_cartridge = /obj/item/weapon/cartridge/syndicate
icon_state = "pda-syndi"
name = "Military PDA"
name = "military PDA"
owner = "John Doe"
hidden = 1
+21 -21
View File
@@ -34,27 +34,27 @@
var/list/stored_data = list()
engineering
name = "Power-ON Cartridge"
name = "\improper Power-ON cartridge"
icon_state = "cart-e"
access_engine = 1
atmos
name = "BreatheDeep Cartridge"
name = "\improper BreatheDeep cartridge"
icon_state = "cart-a"
access_atmos = 1
medical
name = "Med-U Cartridge"
name = "\improper Med-U cartridge"
icon_state = "cart-m"
access_medical = 1
chemistry
name = "ChemWhiz Cartridge"
name = "\improper ChemWhiz cartridge"
icon_state = "cart-chem"
access_reagent_scanner = 1
security
name = "R.O.B.U.S.T. Cartridge"
name = "\improper R.O.B.U.S.T. cartridge"
icon_state = "cart-s"
access_security = 1
@@ -63,7 +63,7 @@
radio = new /obj/item/radio/integrated/beepsky(src)
detective
name = "D.E.T.E.C.T. Cartridge"
name = "\improper D.E.T.E.C.T. cartridge"
icon_state = "cart-s"
access_security = 1
access_medical = 1
@@ -74,30 +74,30 @@
radio = new /obj/item/radio/integrated/beepsky(src)
janitor
name = "CustodiPRO Cartridge"
name = "\improper CustodiPRO cartridge"
desc = "The ultimate in clean-room design."
icon_state = "cart-j"
access_janitor = 1
lawyer
name = "P.R.O.V.E. Cartridge"
name = "\improper P.R.O.V.E. cartridge"
icon_state = "cart-s"
access_security = 1
clown
name = "Honkworks 5.0"
name = "\improper Honkworks 5.0 cartridge"
icon_state = "cart-clown"
access_clown = 1
var/honk_charges = 5
mime
name = "Gestur-O 1000"
name = "\improper Gestur-O 1000 cartridge"
icon_state = "cart-mi"
access_mime = 1
var/mime_charges = 5
/*
botanist
name = "Green Thumb v4.20"
name = "\improper Green Thumb v4.20 cartridge"
icon_state = "cart-b"
access_flora = 1
*/
@@ -107,7 +107,7 @@
desc = "A data cartridge with an integrated radio signaler module."
toxins
name = "Signal Ace 2"
name = "\improper Signal Ace 2 cartridge"
desc = "Complete with integrated radio signaler!"
icon_state = "cart-tox"
access_reagent_scanner = 1
@@ -120,7 +120,7 @@
quartermaster
name = "Space Parts & Space Vendors Cartridge"
name = "space parts & space vendors cartridge"
desc = "Perfect for the Quartermaster on the go!"
icon_state = "cart-q"
access_quartermaster = 1
@@ -130,13 +130,13 @@
radio = new /obj/item/radio/integrated/mule(src)
head
name = "Easy-Record DELUXE"
name = "\improper Easy-Record DELUXE cartridge"
icon_state = "cart-h"
access_manifest = 1
access_status_display = 1
hop
name = "HumanResources9001"
name = "\improper HumanResources9001 cartridge"
icon_state = "cart-h"
access_manifest = 1
access_status_display = 1
@@ -149,7 +149,7 @@
radio = new /obj/item/radio/integrated/mule(src)
hos
name = "R.O.B.U.S.T. DELUXE"
name = "\improper R.O.B.U.S.T. DELUXE cartridge"
icon_state = "cart-hos"
access_manifest = 1
access_status_display = 1
@@ -160,7 +160,7 @@
radio = new /obj/item/radio/integrated/beepsky(src)
ce
name = "Power-On DELUXE"
name = "\improper Power-On DELUXE cartridge"
icon_state = "cart-ce"
access_manifest = 1
access_status_display = 1
@@ -168,7 +168,7 @@
access_atmos = 1
cmo
name = "Med-U DELUXE"
name = "\improper Med-U DELUXE cartridge"
icon_state = "cart-cmo"
access_manifest = 1
access_status_display = 1
@@ -176,7 +176,7 @@
access_medical = 1
rd
name = "Signal Ace DELUXE"
name = "\improper Signal Ace DELUXE cartridge"
icon_state = "cart-rd"
access_manifest = 1
access_status_display = 1
@@ -188,7 +188,7 @@
radio = new /obj/item/radio/integrated/signal(src)
captain
name = "Value-PAK Cartridge"
name = "\improper Value-PAK cartridge"
desc = "Now with 200% more value!"
icon_state = "cart-c"
access_manifest = 1
@@ -204,7 +204,7 @@
radio = new /obj/item/radio/integrated/beepsky(src)
syndicate
name = "Detomatix Cartridge"
name = "\improper Detomatix cartridge"
icon_state = "cart"
access_remote_door = 1
remote_door_id = "smindicate" //Make sure this matches the syndicate shuttle's shield/door id!! //don't ask about the name, testing.
+1 -1
View File
@@ -1,5 +1,5 @@
/obj/item/radio/integrated
name = "PDA radio module"
name = "\improper PDA radio module"
desc = "An electronic radio system of nanotrasen origin."
icon = 'icons/obj/module.dmi'
icon_state = "power_mod"
@@ -15,9 +15,9 @@
name = "camera bug"
desc = "For illicit snooping through the camera network."
icon = 'icons/obj/device.dmi'
icon_state = "mindflash2"
icon_state = "camera_bug"
w_class = 1.0
item_state = "electronic"
item_state = "camera_bug"
throw_speed = 4
throw_range = 20
@@ -198,6 +198,7 @@
/obj/item/device/flashlight/slime
gender = PLURAL
name = "glowing slime extract"
desc = "Extract from a yellow slime. It emits a strong light when squeezed."
icon = 'icons/obj/lighting.dmi'
@@ -181,7 +181,7 @@
emagged = !emagged
playsound(src.loc, "sparks", 100, 1)
if(emagged)
name = "Shortcircuited [initial(name)]"
name = "shortcircuited [initial(name)]"
else
name = initial(name)
update_icon()
@@ -1,5 +1,5 @@
/obj/item/device/radio/beacon
name = "Tracking Beacon"
name = "tracking beacon"
desc = "A beacon used by a teleporter."
icon_state = "beacon"
item_state = "signaler"
@@ -1,6 +1,6 @@
/obj/item/device/encryptionkey/
name = "Standard Encryption Key"
name = "standard encryption key"
desc = "An encryption key for a radio headset. Has no special codes in it. WHY DOES IT EXIST? ASK NANOTRASEN."
icon = 'icons/obj/radio.dmi'
icon_state = "cypherkey"
@@ -27,91 +27,91 @@
origin_tech = "syndicate=3"
/obj/item/device/encryptionkey/headset_sec
name = "Security Radio Encryption Key"
name = "security radio encryption key"
desc = "An encryption key for a radio headset. To access the security channel, use :s."
icon_state = "sec_cypherkey"
channels = list("Security" = 1)
/obj/item/device/encryptionkey/headset_eng
name = "Engineering Radio Encryption Key"
name = "engineering radio encryption key"
desc = "An encryption key for a radio headset. To access the engineering channel, use :e."
icon_state = "eng_cypherkey"
channels = list("Engineering" = 1)
/obj/item/device/encryptionkey/headset_rob
name = "Robotics Radio Encryption Key"
name = "robotics radio encryption key"
desc = "An encryption key for a radio headset. To access the engineering channel, use :e. For research, use :n."
icon_state = "rob_cypherkey"
channels = list("Science" = 1, "Engineering" = 1)
/obj/item/device/encryptionkey/headset_med
name = "Medical Radio Encryption Key"
name = "medical radio encryption key"
desc = "An encryption key for a radio headset. To access the medical channel, use :m."
icon_state = "med_cypherkey"
channels = list("Medical" = 1)
/obj/item/device/encryptionkey/headset_sci
name = "Science Radio Encryption Key"
name = "science radio encryption key"
desc = "An encryption key for a radio headset. To access the science channel, use :n."
icon_state = "sci_cypherkey"
channels = list("Science" = 1)
/obj/item/device/encryptionkey/headset_medsci
name = "Medical Research Radio Encryption Key"
name = "medical research radio encryption key"
desc = "An encryption key for a radio headset. To access the medical channel, use :m. For science, use :n."
icon_state = "medsci_cypherkey"
channels = list("Science" = 1, "Medical" = 1)
/obj/item/device/encryptionkey/headset_com
name = "Command Radio Encryption Key"
name = "command radio encryption key"
desc = "An encryption key for a radio headset. To access the command channel, use :c."
icon_state = "com_cypherkey"
channels = list("Command" = 1)
/obj/item/device/encryptionkey/heads/captain
name = "Captain's Encryption Key"
name = "\proper the captain's encryption key"
desc = "An encryption key for a radio headset. Channels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
icon_state = "cap_cypherkey"
channels = list("Command" = 1, "Security" = 1, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0, "Service" = 0)
/obj/item/device/encryptionkey/heads/rd
name = "Research Director's Encryption Key"
name = "\proper the research director's encryption key"
desc = "An encryption key for a radio headset. To access the science channel, use :n. For command, use :c."
icon_state = "rd_cypherkey"
channels = list("Science" = 1, "Command" = 1)
/obj/item/device/encryptionkey/heads/hos
name = "Head of Security's Encryption Key"
name = "\proper the head of security's encryption key"
desc = "An encryption key for a radio headset. To access the security channel, use :s. For command, use :c."
icon_state = "hos_cypherkey"
channels = list("Security" = 1, "Command" = 1)
/obj/item/device/encryptionkey/heads/ce
name = "Chief Engineer's Encryption Key"
name = "\proper the chief engineer's encryption key"
desc = "An encryption key for a radio headset. To access the engineering channel, use :e. For command, use :c."
icon_state = "ce_cypherkey"
channels = list("Engineering" = 1, "Command" = 1)
/obj/item/device/encryptionkey/heads/cmo
name = "Chief Medical Officer's Encryption Key"
name = "\proper the chief medical officer's encryption key"
desc = "An encryption key for a radio headset. To access the medical channel, use :m. For command, use :c."
icon_state = "cmo_cypherkey"
channels = list("Medical" = 1, "Command" = 1)
/obj/item/device/encryptionkey/heads/hop
name = "Head of Personnel's Encryption Key"
name = "\proper the head of personnel's encryption key"
desc = "An encryption key for a radio headset. Channels are as follows: :u - supply, :v - service, :c - command."
icon_state = "hop_cypherkey"
channels = list("Supply" = 1, "Service" = 1, "Command" = 1)
/obj/item/device/encryptionkey/headset_cargo
name = "Supply Radio Encryption Key"
name = "supply radio encryption key"
desc = "An encryption key for a radio headset. To access the supply channel, use :u."
icon_state = "cargo_cypherkey"
channels = list("Supply" = 1)
/obj/item/device/encryptionkey/headset_service
name = "Service Radio Encryption Key"
name = "service radio encryption key"
desc = "An encryption key for a radio headset. To access the service channel, use :v."
icon_state = "srv_cypherkey"
channels = list("Service" = 1)
@@ -99,42 +99,42 @@
keyslot2 = new /obj/item/device/encryptionkey/headset_com
/obj/item/device/radio/headset/heads/captain
name = "captain's headset"
name = "\proper the captain's headset"
desc = "The headset of the boss. Channels are as follows: :c - command, :s - security, :e - engineering, :u - supply, :v - service, :m - medical, :n - science."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/captain
/obj/item/device/radio/headset/heads/rd
name = "Research Director's headset"
name = "\proper the research director's headset"
desc = "Headset of the fellow who keeps society marching towards technological singularity. To access the science channel, use :n. For command, use :c."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/rd
/obj/item/device/radio/headset/heads/hos
name = "head of security's headset"
name = "\proper the head of security's headset"
desc = "The headset of the man in charge of keeping order and protecting the station. To access the security channel, use :s. For command, use :c."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/hos
/obj/item/device/radio/headset/heads/ce
name = "chief engineer's headset"
name = "\proper the chief engineer's headset"
desc = "The headset of the guy in charge of keeping the station powered and undamaged. To access the engineering channel, use :e. For command, use :c."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/ce
/obj/item/device/radio/headset/heads/cmo
name = "chief medical officer's headset"
name = "\proper the chief medical officer's headset"
desc = "The headset of the highly trained medical chief. To access the medical channel, use :m. For command, use :c."
icon_state = "com_headset"
item_state = "headset"
keyslot2 = new /obj/item/device/encryptionkey/heads/cmo
/obj/item/device/radio/headset/heads/hop
name = "head of personnel's headset"
name = "\proper the head of personnel's headset"
desc = "The headset of the guy who will one day be captain. Channels are as follows: :u - supply, :v - service, :c - command."
icon_state = "com_headset"
item_state = "headset"
@@ -5,7 +5,7 @@
anchored = 1
w_class = 4.0
canhear_range = 2
flags = FPRINT | CONDUCT | TABLEPASS | NOBLOODY
flags = FPRINT | CONDUCT | TABLEPASS
var/number = 0
var/anyai = 1
var/mob/living/silicon/ai/ai = list()
@@ -73,3 +73,6 @@
icon_state = "intercom-p"
else
icon_state = "intercom"
/obj/item/device/radio/intercom/rejects_blood()
return 1
+2 -2
View File
@@ -9,7 +9,7 @@ MASS SPECTROMETER
*/
/obj/item/device/t_scanner
name = "T-ray scanner"
name = "\improper T-ray scanner"
desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
icon_state = "t-ray0"
var/on = 0
@@ -61,7 +61,7 @@ MASS SPECTROMETER
/obj/item/device/healthanalyzer
name = "Health Analyzer"
name = "health analyzer"
icon_state = "health"
item_state = "analyzer"
desc = "A hand-held body scanner able to distinguish vital signs of the subject."
@@ -167,21 +167,24 @@
else
attacher_name = "[attacher.name]([attacher.ckey])"
var/log_str = "Bomb valve opened in <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name]</a> "
log_str += "with [attached_device ? attached_device : "no device"] attacher: [attacher_name]"
var/log_str1 = "Bomb valve opened in "
var/log_str2 = "with [attached_device ? attached_device : "no device"] attacher: [attacher_name]"
var/log_attacher = ""
if(attacher)
log_str += "(<A HREF='?_src_=holder;adminmoreinfo=\ref[attacher]'>?</A>)"
log_attacher = "(<A HREF='?_src_=holder;adminmoreinfo=\ref[attacher]'>?</A>)"
var/mob/mob = get_mob_by_key(src.fingerprintslast)
var/last_touch_info = ""
if(mob)
last_touch_info = "(<A HREF='?_src_=holder;adminmoreinfo=\ref[mob]'>?</A>)"
log_str += " Last touched by: [src.fingerprintslast][last_touch_info]"
bombers += log_str
message_admins(log_str, 0, 1)
log_game(log_str)
var/log_str3 = " Last touched by: [src.fingerprintslast]"
bombers += "[log_str1] <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name]</a> [log_str2][log_attacher] [log_str3][last_touch_info]"
message_admins("[log_str1] <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name]</a> [log_str2][log_attacher] [log_str3][last_touch_info]", 0, 1)
log_game("[log_str1] [A.name]([A.x],[A.y],[A.z]) [log_str2] [log_str3]")
merge_gases()
spawn(20) // In case one tank bursts
for (var/i=0,i<5,i++)
@@ -197,4 +200,4 @@
// this doesn't do anything but the timer etc. expects it to be here
// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs
/obj/item/device/transfer_valve/proc/c_state()
return
return
+1 -1
View File
@@ -121,7 +121,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
*/
/obj/item/device/uplink/hidden
name = "Hidden Uplink."
name = "hidden uplink."
desc = "There is something wrong if you're examining this."
/obj/item/device/uplink/hidden/Topic(href, href_list)
+1 -1
View File
@@ -1,5 +1,5 @@
/obj/item/latexballon
name = "Latex glove"
name = "latex glove"
desc = "" //todo
icon_state = "latexballon"
item_state = "lgloves"
+1 -1
View File
@@ -37,7 +37,7 @@
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
overlays.Cut()
usr << "You slice off [src]'s uneven chunks of aluminum and scorch marks."
usr << "You slice off [src]'s uneven chunks of aluminium and scorch marks."
return
+58 -47
View File
@@ -11,61 +11,72 @@
var/heal_burn = 0
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
if (M.stat == 2)
var/t_him = "it"
if (M.gender == MALE)
t_him = "him"
else if (M.gender == FEMALE)
t_him = "her"
user << "\red \The [M] is dead, you cannot help [t_him]!"
return
var/mob/living/carbon/human/H = M
var/obj/item/organ/limb/affecting = H.get_organ("chest")
if (!istype(M))
user << "\red \The [src] cannot be applied to [M]!"
return 1
if ( ! (istype(user, /mob/living/carbon/human) || \
istype(user, /mob/living/silicon) || \
istype(user, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
user << "\red You don't have the dexterity to do this!"
return 1
if(affecting.status == ORGAN_ORGANIC) //Limb must be organic to be healed - RR
if (M.stat == 2)
var/t_him = "it"
if (M.gender == MALE)
t_him = "him"
else if (M.gender == FEMALE)
t_him = "her"
user << "\red \The [M] is dead, you cannot help [t_him]!"
return
if (user)
if (M != user)
user.visible_message( \
"\blue [M] has been applied with [src] by [user].", \
"\blue You apply \the [src] to [M]." \
)
if (!istype(M))
user << "\red \The [src] cannot be applied to [M]!"
return 1
if ( ! (istype(user, /mob/living/carbon/human) || \
istype(user, /mob/living/silicon) || \
istype(user, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
user << "\red You don't have the dexterity to do this!"
return 1
if (user)
if (M != user)
user.visible_message( \
"\blue [M] has been applied with [src] by [user].", \
"\blue You apply \the [src] to [M]." \
)
else
var/t_himself = "itself"
if (user.gender == MALE)
t_himself = "himself"
else if (user.gender == FEMALE)
t_himself = "herself"
user.visible_message( \
"\blue [M] applied [src] on [t_himself].", \
"\blue You apply \the [src] on yourself." \
)
if (istype(M, /mob/living/carbon/human))
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/user2 = user
affecting = H.get_organ(check_zone(user2.zone_sel.selecting))
else
if(!istype(affecting, /obj/item/organ/limb) || affecting:burn_dam <= 0)
affecting = H.get_organ("head")
if(affecting.status == ORGAN_ORGANIC) // Just in case a robotic limb SOMEHOW got down to this point of the proc all you get is a message - RR
if (affecting.heal_damage(src.heal_brute, src.heal_burn))
H.update_damage_overlays(0)
M.updatehealth()
else
var/t_himself = "itself"
if (user.gender == MALE)
t_himself = "himself"
else if (user.gender == FEMALE)
t_himself = "herself"
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
user.visible_message( \
"\blue [M] applied [src] on [t_himself].", \
"\blue You apply \the [src] on yourself." \
)
if (istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/obj/item/organ/limb/affecting = H.get_organ("chest")
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/user2 = user
affecting = H.get_organ(check_zone(user2.zone_sel.selecting))
else
if(!istype(affecting, /obj/item/organ/limb) || affecting:burn_dam <= 0)
affecting = H.get_organ("head")
if (affecting.heal_damage(src.heal_brute, src.heal_burn))
H.update_damage_overlays(0)
M.updatehealth()
use(1)
else
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
user << "<span class='notice'>Medicine won't work on a robotic limb!</span>"
use(1)
/obj/item/stack/medical/bruise_pack
name = "bruise pack"
+11 -11
View File
@@ -97,7 +97,7 @@
* Fake singularity
*/
/obj/item/toy/spinningtoy
name = "Gravitational Singularity"
name = "gravitational singularity"
desc = "\"Singulo\" brand spinning toy."
icon = 'icons/obj/singularity.dmi'
icon_state = "singularity_s1"
@@ -484,26 +484,26 @@
..()
/obj/item/toy/prize/ripley
name = "toy ripley"
name = "toy Ripley"
desc = "Mini-Mecha action figure! Collect them all! 1/11."
/obj/item/toy/prize/fireripley
name = "toy firefighting ripley"
name = "toy firefighting Ripley"
desc = "Mini-Mecha action figure! Collect them all! 2/11."
icon_state = "fireripleytoy"
/obj/item/toy/prize/deathripley
name = "toy deathsquad ripley"
name = "toy deathsquad Ripley"
desc = "Mini-Mecha action figure! Collect them all! 3/11."
icon_state = "deathripleytoy"
/obj/item/toy/prize/gygax
name = "toy gygax"
name = "toy Gygax"
desc = "Mini-Mecha action figure! Collect them all! 4/11."
icon_state = "gygaxtoy"
/obj/item/toy/prize/durand
name = "toy durand"
name = "toy Durand"
desc = "Mini-Mecha action figure! Collect them all! 5/11."
icon_state = "durandprize"
@@ -513,27 +513,27 @@
icon_state = "honkprize"
/obj/item/toy/prize/marauder
name = "toy marauder"
name = "toy Marauder"
desc = "Mini-Mecha action figure! Collect them all! 7/11."
icon_state = "marauderprize"
/obj/item/toy/prize/seraph
name = "toy seraph"
name = "toy Seraph"
desc = "Mini-Mecha action figure! Collect them all! 8/11."
icon_state = "seraphprize"
/obj/item/toy/prize/mauler
name = "toy mauler"
name = "toy Mauler"
desc = "Mini-Mecha action figure! Collect them all! 9/11."
icon_state = "maulerprize"
/obj/item/toy/prize/odysseus
name = "toy odysseus"
name = "toy Odysseus"
desc = "Mini-Mecha action figure! Collect them all! 10/11."
icon_state = "odysseusprize"
/obj/item/toy/prize/phazon
name = "toy phazon"
name = "toy Phazon"
desc = "Mini-Mecha action figure! Collect them all! 11/11."
icon_state = "phazonprize"
+1 -1
View File
@@ -5,7 +5,7 @@
w_class = 1.0
raisins
name = "4no raisins"
name = "\improper 4no raisins"
icon_state= "4no_raisins"
candy
name = "candy"
@@ -263,7 +263,7 @@
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("aluminum", 30)
B1.reagents.add_reagent("aluminium", 30)
B2.reagents.add_reagent("foaming_agent", 10)
B2.reagents.add_reagent("pacid", 10)
@@ -282,7 +282,7 @@
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("aluminum", 25)
B1.reagents.add_reagent("aluminium", 25)
B2.reagents.add_reagent("plasma", 25)
B2.reagents.add_reagent("sacid", 25)
@@ -16,7 +16,7 @@
/obj/item/weapon/grenade/iedcasing
name = "improvised explosive assembly"
desc = "An igniter stuffed into an aluminum shell."
desc = "An igniter stuffed into an aluminium shell."
w_class = 2.0
icon = 'icons/obj/grenade.dmi'
icon_state = "improvised_grenade"
@@ -64,9 +64,8 @@
add_fingerprint(user)
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
var/log_str = "[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>."
message_admins(log_str)
log_game(log_str)
message_admins("[key_name(usr)]<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A> has primed a [name] for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
log_game("[key_name(usr)] has primed a [name] for detonation at [A.name] ([bombturf.x],[bombturf.y],[bombturf.z]).")
if(iscarbon(user))
var/mob/living/carbon/C = user
C.throw_mode_on()
@@ -1,11 +1,14 @@
/obj/item/weapon/melee/energy
var/active = 0
flags = FPRINT | TABLEPASS | NOBLOODY
flags = FPRINT | TABLEPASS
suicide_act(mob/user)
viewers(user) << pick("\red <b>[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.</b>", \
"\red <b>[user] is falling on the [src.name]! It looks like \he's trying to commit suicide.</b>")
return (BRUTELOSS|FIRELOSS)
/obj/item/weapon/melee/energy/suicide_act(mob/user)
viewers(user) << pick("\red <b>[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.</b>", \
"\red <b>[user] is falling on the [src.name]! It looks like \he's trying to commit suicide.</b>")
return (BRUTELOSS|FIRELOSS)
/obj/item/weapon/melee/energy/rejects_blood()
return 1
/obj/item/weapon/melee/energy/axe
name = "energy axe"
@@ -16,7 +19,7 @@
throw_speed = 1
throw_range = 5
w_class = 3.0
flags = FPRINT | CONDUCT | NOSHIELD | TABLEPASS | NOBLOODY
flags = FPRINT | CONDUCT | NOSHIELD | TABLEPASS
origin_tech = "combat=3"
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
@@ -50,7 +53,7 @@
throw_speed = 1
throw_range = 5
w_class = 2.0
flags = FPRINT | TABLEPASS | NOSHIELD | NOBLOODY
flags = FPRINT | TABLEPASS | NOSHIELD
origin_tech = "magnets=3;syndicate=4"
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
var/hacked = 0
@@ -152,7 +155,7 @@
throw_speed = 1
throw_range = 1
w_class = 4.0//So you can't hide it in your pocket or some such.
flags = FPRINT | TABLEPASS | NOSHIELD | NOBLOODY
flags = FPRINT | TABLEPASS | NOSHIELD
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
var/datum/effect/effect/system/spark_spread/spark_system
@@ -27,8 +27,9 @@
var/mob/living/carbon/human/H = M
var/heal_amt = 10
for(var/obj/item/organ/limb/affecting in H.organs)
if(affecting.heal_damage(heal_amt, heal_amt))
H.update_damage_overlays(0)
if(affecting.status == ORGAN_ORGANIC) //No Bible can heal a robotic arm!
if(affecting.heal_damage(heal_amt, heal_amt))
H.update_damage_overlays(0)
return
/obj/item/weapon/storage/bible/attack(mob/living/M as mob, mob/living/user as mob)
@@ -70,10 +71,24 @@
ticker.mode.remove_cultist(M.mind)*/
if ((istype(M, /mob/living/carbon/human) && prob(60)))
bless(M)
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] heals [] with the power of [src.deity_name]!</B>", user, M), 1)
M << "\red May the power of [src.deity_name] compel you to be healed!"
playsound(src.loc, "punch", 25, 1, -1)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/message_halt = 0
for(var/obj/item/organ/limb/affecting in H.organs)
if(affecting.status == ORGAN_ORGANIC)
if(message_halt == 0)
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] heals [] with the power of [src.deity_name]!</B>", user, M), 1)
M << "\red May the power of [src.deity_name] compel you to be healed!"
playsound(src.loc, "punch", 25, 1, -1)
message_halt = 1
else
src << "<span class='warning'>[src.deity_name] refuses to heal this metalic taint!</span>"
return
else
if(ishuman(M) && !istype(M:head, /obj/item/clothing/head/helmet))
M.adjustBrainLoss(10)
@@ -81,6 +96,7 @@
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] beats [] over the head with []!</B>", user, M, src), 1)
playsound(src.loc, "punch", 25, 1, -1)
else if(M.stat == 2)
for(var/mob/O in viewers(M, null))
O.show_message(text("\red <B>[] smacks []'s lifeless corpse with [].</B>", user, M, src), 1)
@@ -20,7 +20,7 @@
var/display_contents_with_number //Set this to make the storage item group contents of the same type and display them as a number.
var/allow_quick_empty //Set this variable to allow the object to have the 'empty' verb, which dumps all the contents on the floor.
var/allow_quick_gather //Set this variable to allow the object to have the 'toggle mode' verb, which quickly collects all items from a tile.
var/collection_mode = 1; //0 = pick one at a time, 1 = pick all on tile
var/collection_mode = 1; //0 = pick one at a time, 1 = pick all on tile, 2 = pick all of a type
/obj/item/weapon/storage/MouseDrop(obj/over_object)
@@ -180,7 +180,7 @@
//This proc return 1 if the item can be picked up and 0 if it can't.
//Set the stop_messages to stop it from printing messages
/obj/item/weapon/storage/proc/can_be_inserted(obj/item/W, stop_messages = 0)
if(!istype(W)) return //Not an item
if(!istype(W) || (W.flags & ABSTRACT)) return //Not an item
if(loc == W)
return 0 //Means the item is already in the storage item
@@ -351,8 +351,10 @@
set name = "Switch Gathering Method"
set category = "Object"
collection_mode = !collection_mode
collection_mode = (collection_mode+1)%3
switch (collection_mode)
if(2)
usr << "[src] now picks up all items of a single type at once."
if(1)
usr << "[src] now picks up all items in a tile at once."
if(0)
@@ -31,11 +31,11 @@
on = !on
if(on)
icon_state = "[icon_state]-on"
// item_state = "[item_state]-on"
// item_state = "[item_state]-on"
ion_trail.start()
else
icon_state = initial(icon_state)
// item_state = initial(item_state)
// item_state = initial(item_state)
ion_trail.stop()
return
@@ -81,6 +81,14 @@
..()
air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
/obj/item/weapon/tank/jetpack/oxygen/harness
name = "jet harness (oxygen)"
desc = "A lightweight tactical harness, used by those who don't want to be weighed down by traditional jetpacks."
icon_state = "jetpack-mini"
item_state = "jetpack-mini"
volume = 40
throw_range = 7
w_class = 3
/obj/item/weapon/tank/jetpack/carbondioxide
name = "jetpack (carbon dioxide)"
+1 -1
View File
@@ -99,7 +99,7 @@
name = "offhand"
icon_state = "offhand"
w_class = 5.0
abstract = 1
flags = ABSTRACT
/obj/item/weapon/twohanded/offhand/unwield()
del(src)
@@ -12,7 +12,7 @@
/obj/structure/closet/syndicate/personal/New()
..()
sleep(2)
new /obj/item/weapon/tank/jetpack/oxygen(src)
new /obj/item/weapon/tank/jetpack/oxygen/harness(src)
new /obj/item/clothing/mask/gas/syndicate(src)
new /obj/item/clothing/under/syndicate(src)
new /obj/item/clothing/head/helmet/space/rig/syndi(src)
@@ -120,8 +120,8 @@
/obj/structure/closet/wardrobe/yellow
name = "yellow wardrobe"
icon_state = "wardrobe-y"
icon_closed = "wardrobe-y"
icon_state = "yellow"
icon_closed = "yeloww"
/obj/structure/closet/wardrobe/yellow/New()
new /obj/item/clothing/under/color/yellow(src)
@@ -135,8 +135,8 @@
/obj/structure/closet/wardrobe/atmospherics_yellow
name = "atmospherics wardrobe"
icon_state = "yellow"
icon_closed = "yellow"
icon_state = "atmos"
icon_closed = "atmos"
/obj/structure/closet/wardrobe/atmospherics_yellow/New()
new /obj/item/clothing/under/rank/atmospheric_technician(src)
@@ -378,23 +378,3 @@
src.req_access += pick(get_all_accesses())
..()
/obj/structure/closet/crate/ex_act(severity)
switch(severity)
if(1.0)
for(var/obj/O in src.contents)
del(O)
del(src)
return
if(2.0)
for(var/obj/O in src.contents)
if(prob(50))
del(O)
del(src)
return
if(3.0)
if (prob(50))
del(src)
return
else
return
+6 -6
View File
@@ -7,21 +7,22 @@
return
var/frequency = get_rand_frequency() // Same frequency for everybody
var/turf/turf_source = get_turf(source)
// Looping through the player list has the added bonus of working for mobs inside containers
for (var/P in player_list)
var/mob/M = P
if(!M || !M.client)
continue
var/turf/T = get_turf(M)
if(T && T.z == source.z)
if(get_dist(T, source) <= world.view + extrarange)
M.playsound_local(source, soundin, vol, vary, frequency, falloff)
if(get_dist(M, turf_source) <= world.view + extrarange)
var/turf/T = get_turf(M)
if(T && T.z == turf_source.z)
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff)
var/const/FALLOFF_SOUNDS = 1
var/const/SURROUND_CAP = 7
/mob/proc/playsound_local(var/atom/source, soundin, vol as num, vary, frequency, falloff)
/mob/proc/playsound_local(var/turf/turf_source, soundin, vol as num, vary, frequency, falloff)
if(!src.client || ear_deaf > 0) return
soundin = get_sfx(soundin)
@@ -36,7 +37,6 @@ var/const/SURROUND_CAP = 7
else
S.frequency = get_rand_frequency()
var/turf/turf_source = get_turf(source)
if(isturf(turf_source))
// 3D sounds, the technology is here!
var/turf/T = get_turf(src)
+22 -1
View File
@@ -76,4 +76,25 @@ var/global/normal_ooc_colour = "#002eb8"
prefs.ooccolor = sanitize_ooccolor(new_ooccolor)
prefs.save_preferences()
feedback_add_details("admin_verb","OC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
return
//Checks admin notice
/client/verb/admin_notice()
set name = "Adminnotice"
set category = "Admin"
set desc ="Check the admin notice if it has been set"
if(admin_notice)
src << "\blue <b>Admin Notice:</b>\n \t [admin_notice]"
else
src << "\blue There are no admin notices at the moment."
/client/verb/motd()
set name = "MOTD"
set category = "OOC"
set desc ="Check the Message of the Day"
if(join_motd)
src << "<div class=\"motd\">[join_motd]</div>"
else
src << "\blue The Message of the Day has not been set."
+2 -2
View File
@@ -134,8 +134,8 @@ var/savefile/Banlist
log_admin("Ban Expired: [key]")
message_admins("Ban Expired: [key]")
else
ban_unban_log_save("[key_name_admin(usr)] unbanned [key]")
log_admin("[key_name_admin(usr)] unbanned [key]")
ban_unban_log_save("[key_name(usr)] unbanned [key]")
log_admin("[key_name(usr)] unbanned [key]")
message_admins("[key_name_admin(usr)] unbanned: [key]")
feedback_inc("ban_unban",1)
usr.client.holder.DB_ban_unban( ckey(key), BANTYPE_ANY_FULLBAN)
+19
View File
@@ -537,6 +537,25 @@ var/global/floorIsLava = 0
log_admin("Announce: [key_name(usr)] : [message]")
feedback_add_details("admin_verb","A") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/set_admin_notice()
set category = "Special Verbs"
set name = "Set Admin Notice"
set desc ="Set an announcement that appears to everyone who joins the server. Only lasts this round"
if(!check_rights(0)) return
admin_notice = input(src,"Set a public notice for this round. Everyone who joins the server will see it.\n(Leaving it blank will delete the current notice):","Set Notice",admin_notice) as null|message
switch(admin_notice)
if(null)
return
if("")
message_admins("[key_name(usr)] removed the admin notice.")
log_admin("[key_name(usr)] removed the admin notice:\n[admin_notice]")
return
message_admins("[key_name(usr)] set the admin notice.")
log_admin("[key_name(usr)] set the admin notice:\n[admin_notice]")
world << "\blue <b>Admin Notice:</b>\n \t [admin_notice]"
feedback_add_details("admin_verb","SAN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/toggleooc()
set category = "Server"
set desc="Toggle dis bitch"
+1 -1
View File
@@ -281,4 +281,4 @@ var/list/admin_ranks = list() //list of all admin_rank datums
log_admin("[key_name(usr)] added keyword [keyword] to permission of [adm_ckey]")
log_admin_permission_modification(adm_ckey, D.rank.rights)
edit_admin_permissions()
edit_admin_permissions()
+2
View File
@@ -27,6 +27,7 @@ var/list/admin_verbs_admin = list(
/datum/admins/proc/toggleenter, /*toggles whether people can join the current game*/
/datum/admins/proc/toggleguests, /*toggles whether guests can join the current game*/
/datum/admins/proc/announce, /*priority announce something to all clients.*/
/datum/admins/proc/set_admin_notice,/*announcement all clients see when joining the server.*/
/client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
/client/proc/toggle_view_range, /*changes how far we can see*/
/datum/admins/proc/view_txt_log, /*shows the server log (diary) for today*/
@@ -138,6 +139,7 @@ var/list/admin_verbs_hideable = list(
/datum/admins/proc/toggleenter,
/datum/admins/proc/toggleguests,
/datum/admins/proc/announce,
/datum/admins/proc/set_admin_notice,
/client/proc/admin_ghost,
/client/proc/toggle_view_range,
/datum/admins/proc/view_txt_log,
+2 -2
View File
@@ -175,9 +175,9 @@ var/savefile/Banlistjob
log_admin("Banjob Expired: [key]")
message_admins("Banjob Expired: [key]")
else
log_admin("[key_name_admin(usr)] unjobbanned [key] from [rank]")
log_admin("[key_name(usr)] unjobbanned [key] from [rank]")
message_admins("[key_name_admin(usr)] unjobbanned:[key] from [rank]")
ban_unban_log_save("[key_name_admin(usr)] unjobbanned [key] from [rank]")
ban_unban_log_save("[key_name(usr)] unjobbanned [key] from [rank]")
feedback_inc("ban_job_unban",1)
feedback_add_details("ban_job_unban","- [rank]")
+5 -5
View File
@@ -1671,7 +1671,7 @@
MAX_EX_HEAVY_RANGE = 7
MAX_EX_DEVESTATION_RANGE = 3
message_admins("\red <b> [key_name_admin(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]</b>", 1)
log_admin("[key_name_admin(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]")
log_admin("[key_name(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]")
if("wave")
feedback_inc("admin_secrets_fun_used",1)
@@ -1944,7 +1944,7 @@
for(var/name in listkicked)
strkicked += "[name], "
message_admins("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]", 1)
log_admin("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
log_admin("[key_name(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
else
usr << "You may only use this when the game is running"
if("showailaws")
@@ -2070,7 +2070,7 @@
newChannel.is_admin_channel = 1
feedback_inc("newscaster_channels",1)
news_network.network_channels += newChannel //Adding channel to the global network
log_admin("[key_name_admin(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!")
log_admin("[key_name(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!")
src.admincaster_screen=5
src.access_news_network()
@@ -2105,7 +2105,7 @@
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.newsAlert(src.admincaster_feed_channel.channel_name)
log_admin("[key_name_admin(usr)] submitted a feed story to channel: [src.admincaster_feed_channel.channel_name]!")
log_admin("[key_name(usr)] submitted a feed story to channel: [src.admincaster_feed_channel.channel_name]!")
src.access_news_network()
else if(href_list["ac_create_channel"])
@@ -2170,7 +2170,7 @@
news_network.wanted_issue.body = src.admincaster_feed_message.body
news_network.wanted_issue.backup_author = src.admincaster_feed_message.backup_author
src.admincaster_screen = 19
log_admin("[key_name_admin(usr)] issued a Station-wide Wanted Notification for [src.admincaster_feed_message.author]!")
log_admin("[key_name(usr)] issued a Station-wide Wanted Notification for [src.admincaster_feed_message.author]!")
src.access_news_network()
else if(href_list["ac_cancel_wanted"])
+1 -1
View File
@@ -8,7 +8,7 @@
/obj/effect/spawner/lootdrop/initialize()
if(loot && loot.len)
for(var/i = lootcount, i > 0, i--)
if(!loot.len) return
if(!loot.len) break
var/lootspawn = pick(loot)
if(!lootdoubles)
loot.Remove(lootspawn)
+4 -1
View File
@@ -129,7 +129,10 @@
prefs.save_preferences()
src << "Others can[(prefs.toggles & MEMBER_PUBLIC) ? "" : "not"] see whether you are a byond member."
var/list/ghost_forms = list("ghost","ghostking","ghostian2")
var/list/ghost_forms = list("ghost","ghostking","ghostian2","ghost_red","ghost_black", \
"ghost_blue","ghost_yellow","ghost_green","ghost_pink", \
"ghost_cyan","ghost_dblue","ghost_dred","ghost_dgreen", \
"ghost_dcyan","ghost_grey","ghost_dyellow","ghost_dpink")
/client/verb/pick_form()
set name = "Choose Ghost Form"
set category = "Preferences"
@@ -42,8 +42,12 @@
item_color = "medical" //Exists for washing machines. Is not different from latex gloves in any way.
/obj/item/clothing/gloves/botanic_leather
desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin."
desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin. They're also quite warm."
name = "botanist's leather gloves"
icon_state = "leather"
item_state = "ggloves"
permeability_coefficient = 0.9
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
+1
View File
@@ -20,6 +20,7 @@
item_state = "bio_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
allowed = list(/obj/item/weapon/disk, /obj/item/weapon/stamp, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/weapon/melee, /obj/item/weapon/storage/lockbox/medal, /obj/item/device/flash, /obj/item/weapon/storage/box/matches, /obj/item/weapon/lighter, /obj/item/clothing/mask/cigarette, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/tank/emergency_oxygen)
//Chaplain
/obj/item/clothing/suit/chaplain_hoodie
@@ -1,11 +1,8 @@
/mob
var/bloody_hands = 0
var/mob/living/carbon/human/bloody_hands_mob
var/track_blood
var/mob/living/carbon/human/track_blood_mob
var/track_blood_type
/obj/item/clothing/gloves
var/transfer_blood = 0

Some files were not shown because too many files have changed in this diff Show More