Merge branch 'master' into crates

This commit is contained in:
Chinsky
2012-12-01 07:14:31 +04:00
100 changed files with 9956 additions and 9503 deletions
+2
View File
@@ -237,6 +237,7 @@
#define FILE_DIR "icons/mecha"
#define FILE_DIR "icons/misc"
#define FILE_DIR "icons/mob"
#define FILE_DIR "icons/mob/human_races"
#define FILE_DIR "icons/obj"
#define FILE_DIR "icons/obj/assemblies"
#define FILE_DIR "icons/obj/atmospherics"
@@ -1329,6 +1330,7 @@
#include "code\modules\scripting\Scanner\Tokens.dm"
#include "code\modules\security levels\keycard authentication.dm"
#include "code\modules\security levels\security levels.dm"
#include "code\WorkInProgress\autopsy.dm"
#include "code\WorkInProgress\buildmode.dm"
#include "code\WorkInProgress\explosion_particles.dm"
#include "code\WorkInProgress\surgery.dm"
+189
View File
@@ -0,0 +1,189 @@
/datum/autopsy_data_scanner
var/weapon = null // this is the DEFINITE weapon type that was used
var/list/organs_scanned = list() // this maps a number of scanned organs to
// the wounds to those organs with this data's weapon type
var/organ_names = ""
/datum/autopsy_data
var/weapon = null
var/pretend_weapon = null
var/damage = 0
var/hits = 0
var/time_inflicted = 0
proc/copy()
var/datum/autopsy_data/W = new()
W.weapon = weapon
W.pretend_weapon = pretend_weapon
W.damage = damage
W.hits = hits
W.time_inflicted = time_inflicted
return W
/obj/item/weapon/autopsy_scanner/proc/add_data(var/datum/organ/external/O)
if(!O.autopsy_data.len && !O.trace_chemicals.len) return
for(var/V in O.autopsy_data)
var/datum/autopsy_data/W = O.autopsy_data[V]
if(!W.pretend_weapon)
/*
// the more hits, the more likely it is that we get the right weapon type
if(prob(50 + W.hits * 10 + W.damage))
*/
// Buffing this stuff up for now!
if(1)
W.pretend_weapon = W.weapon
else
W.pretend_weapon = pick("mechanical toolbox", "wirecutters", "revolver", "crowbar", "fire extinguisher", "tomato soup", "oxygen tank", "emergency oxygen tank", "laser", "bullet")
var/datum/autopsy_data_scanner/D = wdata[V]
if(!D)
D = new()
D.weapon = W.weapon
wdata[V] = D
if(!D.organs_scanned[O.name])
if(D.organ_names == "")
D.organ_names = O.display_name
else
D.organ_names += ", [O.display_name]"
del D.organs_scanned[O.name]
D.organs_scanned[O.name] = W.copy()
for(var/V in O.trace_chemicals)
if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V))
chemtraces += V
/obj/item/weapon/autopsy_scanner/verb/print_data()
set src in view(usr, 1)
set name = "Print Data"
if(usr.stat)
usr << "No."
return
if(wdata.len == 0 && chemtraces.len == 0)
usr << "<b>* There is no data about any wounds in the scanner's database. You may have to scan more bodyparts, or otherwise this wound type may not be in the scanner's database."
return
var/scan_data = ""
if(timeofdeath)
scan_data += "<b>Time of death:</b> [worldtime2text(timeofdeath)]<br><br>"
var/n = 1
for(var/wdata_idx in wdata)
var/datum/autopsy_data_scanner/D = wdata[wdata_idx]
var/total_hits = 0
var/total_score = 0
var/list/weapon_chances = list() // maps weapon names to a score
var/age = 0
for(var/wound_idx in D.organs_scanned)
var/datum/autopsy_data/W = D.organs_scanned[wound_idx]
total_hits += W.hits
var/wname = W.pretend_weapon
if(wname in weapon_chances) weapon_chances[wname] += W.damage
else weapon_chances[wname] = max(W.damage, 1)
total_score+=W.damage
var/wound_age = W.time_inflicted
age = max(age, wound_age)
var/damage_desc
var/damaging_weapon = (total_score != 0)
// total score happens to be the total damage
switch(total_score)
if(0)
damage_desc = "Unknown"
if(1 to 5)
damage_desc = "<font color='green'>negligible</font>"
if(5 to 15)
damage_desc = "<font color='green'>light</font>"
if(15 to 30)
damage_desc = "<font color='orange'>moderate</font>"
if(30 to 1000)
damage_desc = "<font color='red'>severe</font>"
if(!total_score) total_score = D.organs_scanned.len
scan_data += "<b>Weapon #[n]</b><br>"
if(damaging_weapon)
scan_data += "Severity: [damage_desc]<br>"
scan_data += "Hits by weapon: [total_hits]<br>"
scan_data += "Approximate time of wound infliction: [worldtime2text(age)]<br>"
scan_data += "Affected limbs: [D.organ_names]<br>"
scan_data += "Possible weapons:<br>"
for(var/weapon_name in weapon_chances)
scan_data += "\t[100*weapon_chances[weapon_name]/total_score]% [weapon_name]<br>"
scan_data += "<br>"
n++
if(chemtraces.len)
scan_data += "<b>Trace Chemicals: </b><br>"
for(var/chemID in chemtraces)
scan_data += chemID
scan_data += "<br>"
for(var/mob/O in viewers(usr))
O.show_message("\red \the [src] rattles and prints out a sheet of paper.", 1)
sleep(10)
var/obj/item/weapon/paper/P = new(usr.loc)
P.name = "Autopsy Data ([target_name])"
P.info = "<tt>[scan_data]</tt>"
P.overlays += "paper_words"
if(istype(usr,/mob/living/carbon))
// place the item in the usr's hand if possible
if(!usr.r_hand)
P.loc = usr
usr.r_hand = P
P.layer = 20
else if(!usr.l_hand)
P.loc = usr
usr.l_hand = P
P.layer = 20
if(istype(usr,/mob/living/carbon/human))
usr:update_inv_l_hand()
usr:update_inv_r_hand()
/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
if(!istype(M))
return
if(!can_operate(M))
return
if(target_name != M.name)
target_name = M.name
src.wdata = list()
user << "\red A new patient has been registered.. Purging data for previous patient."
src.timeofdeath = M.timeofdeath
var/datum/organ/external/S = M.get_organ(user.zone_sel.selecting)
if(!S)
usr << "<b>You can't scan this body part.</b>"
return
if(!S.open)
usr << "<b>You have to cut the limb open first!</b>"
return
for(var/mob/O in viewers(M))
O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.display_name] with \the [src.name]", 1)
src.add_data(S)
return 1
+94 -65
View File
@@ -282,15 +282,15 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\blue [user] has removed [target]'s appendix with \the [tool].", \
"\blue You have removed [target]'s appendix with \the [tool].")
var/datum/disease/appendicitis/app = null
var/app = 0
for(var/datum/disease/appendicitis/appendicitis in target.viruses)
app = appendicitis
app = 1
appendicitis.cure()
target.resistances += appendicitis
if (app)
new /obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed(get_turf(target))
else
new /obj/item/weapon/reagent_containers/food/snacks/appendix(get_turf(target))
target.resistances += app
target.op_stage.appendix = 2
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -308,6 +308,9 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
/datum/surgery_step/fix_vein
required_tool = /obj/item/weapon/FixOVein
min_duration = 70
max_duration = 90
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
@@ -320,9 +323,8 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
if (affected.stage == 0)
user.visible_message("[user] starts patching the damaged vein in [target]'s [affected.display_name] with \the [tool]." , \
"You start patching the damaged vein in [target]'s [affected.display_name] with \the [tool].")
user.visible_message("[user] starts patching the damaged vein in [target]'s [affected.display_name] with \the [tool]." , \
"You start patching the damaged vein in [target]'s [affected.display_name] with \the [tool].")
target.custom_pain("The pain in [affected.display_name] is unbearable!",1)
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -387,7 +389,7 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user] is beginning to set the bone in [target]'s [affected.display_name] in place with \the [tool]." , \
"You are beginning to set the bone in [target]'s [target_zone] in place with \the [tool].")
"You are beginning to set the bone in [target]'s [affected.display_name] in place with \the [tool].")
target.custom_pain("The pain in your [affected.display_name] is going to make you pass out!",1)
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -425,15 +427,15 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\blue [user] sets [target]'s [affected.display_name] skull with \the [tool]." , \
"\blue You set [target]'s [affected.display_name] skull with \the [tool].")
user.visible_message("\blue [user] sets [target]'s skull with \the [tool]." , \
"\blue You set [target]'s skull with \the [tool].")
affected.stage = 2
spread_germs_to_organ(affected, user)
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, damaging [target]'s [affected.display_name] face with \the [tool]!" , \
"\red Your hand slips, damaging [target]'s [affected.display_name] face with \the [tool]!")
user.visible_message("\red [user]'s hand slips, damaging [target]'s face with \the [tool]!" , \
"\red Your hand slips, damaging [target]'s face with \the [tool]!")
var/datum/organ/external/head/h = affected
h.createwound(BRUISE, 10)
h.disfigured = 1
@@ -855,7 +857,8 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
target.cores--
user.visible_message("\blue [user] cuts out one of [target]'s cores with \the [tool].",, \
"\blue You cut out one of [target]'s cores with \the [tool]. [target.cores] cores left.")
new/obj/item/metroid_core(target.loc)
if(target.cores >= 0)
new/obj/item/metroid_core(target.loc)
if(target.cores <= 0)
target.icon_state = "baby roro dead-nocore"
@@ -959,6 +962,7 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
"\blue You have finished adjusting the area around [target]'s [affected.display_name] with \the [tool].")
affected.status |= ORGAN_ATTACHABLE
affected.amputated = 1
affected.setAmputatedTree()
affected.open = 0
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -1007,19 +1011,14 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
//////////////////////////////////////////////////////////////////
// ALIEN SURGERY //
// RIBCAGE SURGERY(LUNGS AND ALIENS) //
//////////////////////////////////////////////////////////////////
/datum/surgery_step/alien
/datum/surgery_step/ribcage
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/embryo = 0
for(var/datum/disease/alien_embryo/A in target.viruses)
embryo = 1
break
return target_zone == "chest"
return embryo && target_zone == "chest"
/datum/surgery_step/alien/saw_ribcage
/datum/surgery_step/ribcage/saw_ribcage
required_tool = /obj/item/weapon/circular_saw
min_duration = 50
@@ -1027,7 +1026,7 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/affected = target.get_organ(target_zone)
return ..() && target.embryo_op_stage == 0 && affected.open >= 2
return ..() && target.ribcage_op_stage == 0 && affected.open >= 2
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] begins to cut through [target]'s ribcage with \the [tool].", \
@@ -1037,21 +1036,21 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\blue [user] has cut through [target]'s ribcage open with \the [tool].", \
"\blue You have cut through [target]'s ribcage open with \the [tool].")
target.embryo_op_stage = 1
target.ribcage_op_stage = 1
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\red [user]'s hand slips, cracking [target]'s ribcage with \the [tool]!" , \
"\red Your hand slips, cracking [target]'s ribcage with \the [tool]!" )
/datum/surgery_step/alien/retract_ribcage
/datum/surgery_step/ribcage/retract_ribcage
required_tool = /obj/item/weapon/retractor
min_duration = 30
max_duration = 40
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return ..() && target.embryo_op_stage == 1
return ..() && target.ribcage_op_stage == 1
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "[user] starts to force open the ribcage in [target]'s torso with \the [tool]."
@@ -1063,7 +1062,7 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
var/msg = "\blue [user] forces open [target]'s ribcage with \the [tool]."
var/self_msg = "\blue You force open [target]'s ribcage with \the [tool]."
user.visible_message(msg, self_msg)
target.embryo_op_stage = 2
target.ribcage_op_stage = 2
// Whoops!
if(prob(10))
@@ -1077,14 +1076,64 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
var/datum/organ/external/affected = target.get_organ(target_zone)
affected.fracture()
/datum/surgery_step/alien/remove_embryo
/datum/surgery_step/ribcage/close_ribcage
required_tool = /obj/item/weapon/retractor
min_duration = 20
max_duration = 40
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return ..() && target.ribcage_op_stage == 2
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "[user] starts bending [target]'s ribcage back into place with \the [tool]."
var/self_msg = "You start bending [target]'s ribcage back into place with \the [tool]."
user.visible_message(msg, self_msg)
target.custom_pain("Something hurts horribly in your chest!",1)
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "\blue [user] bends [target]'s ribcage back into place with \the [tool]."
var/self_msg = "\blue You bend [target]'s ribcage back into place with \the [tool]."
user.visible_message(msg, self_msg)
target.ribcage_op_stage = 1
/datum/surgery_step/ribcage/mend_ribcage
required_tool = /obj/item/weapon/bonegel
min_duration = 20
max_duration = 40
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return ..() && target.ribcage_op_stage == 1
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "[user] starts applying \the [tool] to [target]'s ribcage."
var/self_msg = "You start applying \the [tool] to [target]'s ribcage."
user.visible_message(msg, self_msg)
target.custom_pain("Something hurts horribly in your chest!",1)
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "\blue [user] applied \the [tool] to [target]'s ribcage."
var/self_msg = "\blue You applied \the [tool] to [target]'s ribcage."
user.visible_message(msg, self_msg)
target.ribcage_op_stage = 0
/datum/surgery_step/ribcage/remove_embryo
required_tool = /obj/item/weapon/hemostat
min_duration = 80
max_duration = 100
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return ..() && target.embryo_op_stage == 2
var/embryo = 0
for(var/datum/disease/alien_embryo/A in target.viruses)
embryo = 1
break
return ..() && embryo && target.ribcage_op_stage == 2
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "[user] starts to pull something out from [target]'s ribcage with \the [tool]."
@@ -1099,52 +1148,32 @@ proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user)
var/mob/living/carbon/alien/larva/stupid = new(target.loc)
stupid.death(0)
target.embryo_op_stage = 3
for(var/datum/disease/alien_embryo in target.viruses)
alien_embryo.cure()
/datum/surgery_step/alien/close_ribcage
required_tool = /obj/item/weapon/retractor
/datum/surgery_step/ribcage/fix_lungs
required_tool = /obj/item/weapon/scalpel
min_duration = 20
max_duration = 40
min_duration = 70
max_duration = 90
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return target.embryo_op_stage >= 2
return ..() && target.is_lung_ruptured() && target.ribcage_op_stage == 2
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "[user] starts bending [target]'s ribcage back into place with \the [tool]."
var/self_msg = "You start bending [target]'s ribcage back into place with \the [tool]."
user.visible_message(msg, self_msg)
target.custom_pain("Something hurts horribly in your chest!",1)
user.visible_message("[user] starts mending the rupture in [target]'s lungs with \the [tool].", \
"You start mending the rupture in [target]'s lungs with \the [tool]." )
target.custom_pain("The pain in your chest is living hell!",1)
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "[user] bends [target]'s ribcage back into place with \the [tool]."
var/self_msg = "You bends [target]'s ribcage back into place with \the [tool]."
user.visible_message(msg, self_msg)
var/datum/organ/external/chest/affected = target.get_organ("chest")
user.visible_message("\blue [user] mends the rupture in [target]'s lungs with \the [tool].", \
"\blue You mend the rupture in [target]'s lungs with \the [tool]." )
affected.ruptured_lungs = 0
target.embryo_op_stage = 1
fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/datum/organ/external/chest/affected = target.get_organ("chest")
user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s chest with \the [tool]!", \
"\red Your hand slips, slicing an artery inside [target]'s chest with \the [tool]!")
affected.createwound(CUT, 20)
/datum/surgery_step/alien/mend_ribcage
required_tool = /obj/item/weapon/bonegel
min_duration = 20
max_duration = 40
can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return target.embryo_op_stage == 1
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "[user] starts applying \the [tool] to [target]'s ribcage."
var/self_msg = "You start applying \the [tool] to [target]'s ribcage."
user.visible_message(msg, self_msg)
target.custom_pain("Something hurts horribly in your chest!",1)
end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "[user] applied \the [tool] to [target]'s ribcage."
var/self_msg = "You applied \the [tool] to [target]'s ribcage."
user.visible_message(msg, self_msg)
target.embryo_op_stage = 0
+1 -1
View File
@@ -165,5 +165,5 @@
if(beaker)
if(!beaker.reagents.remove_reagent("virusfood",5))
foodsupply += 10
if(!beaker.reagents.remove_reagent("toxins",1))
if(!beaker.reagents.remove_reagent("toxin",1))
toxins += 1
+5
View File
@@ -277,6 +277,11 @@ datum
proc/ConsiderRebuild(var/turf/simulated/T, var/turf/NT)
if(!istype(T)) return
//zones should naturally spread to these tiles eventually
if(!T.zone || !NT.zone)
return
if(istype(NT, /turf/simulated) && NT.zone != T.zone)
T.zone.RemoveTurf(NT)
if(NT.zone)
+59 -31
View File
@@ -2,13 +2,14 @@ var/datum/controller/vote/vote = new()
datum/controller/vote
var/initiator = null
var/started_timeofday = null
var/started_time = null
var/time_remaining = 0
var/mode = null
var/question = null
var/list/choices = list()
var/list/voted = list()
var/list/voting = list()
var/list/current_votes = list()
New()
if(vote != src)
@@ -18,28 +19,29 @@ datum/controller/vote
proc/process() //called by master_controller
if(mode)
time_remaining = started_timeofday + config.vote_period
if(world.timeofday < started_timeofday)
time_remaining -= 864000
time_remaining = round((time_remaining - world.timeofday)/10)
// No more change mode votes after the game has started.
// 3 is GAME_STATE_PLAYING, but that #define is undefined for some reason
if(mode == "gamemode" && ticker.current_state >= 2)
world << "<b>Voting aborted due to game start.</b>"
src.reset()
return
// Calculate how much time is remaining by comparing current time, to time of vote start,
// plus vote duration
time_remaining = round((started_time + config.vote_period - world.time)/10)
var/i=1
if(time_remaining < 0)
result()
while(i<=voting.len)
var/client/C = voting[i]
for(var/client/C in voting)
if(C)
C << browse(null,"window=vote;can_close=0")
i++
reset()
else
while(i<=voting.len)
var/client/C = voting[i]
for(var/client/C in voting)
if(C)
C << browse(vote.interface(C),"window=vote;can_close=0")
i++
else
voting.Cut(i,i+1)
voting.Cut()
proc/reset()
initiator = null
@@ -49,6 +51,7 @@ datum/controller/vote
choices.Cut()
voted.Cut()
voting.Cut()
current_votes.Cut()
proc/get_result()
//get the highest number of votes
@@ -111,6 +114,10 @@ datum/controller/vote
restart = 1
else
master_mode = .
if("crew_transfer")
if(. == "Initiate Crew Transfer")
init_shift_change(null, 1)
if(restart)
world << "World restarting due to vote..."
@@ -122,30 +129,39 @@ datum/controller/vote
return .
proc/submit_vote(var/vote)
proc/submit_vote(var/ckey, var/vote)
if(mode)
if(config.vote_no_dead && usr.stat == DEAD && !usr.client.holder)
return 0
if(!(usr.ckey in voted))
if(vote && 1<=vote && vote<=choices.len)
voted += usr.ckey
choices[choices[vote]]++ //check this
return vote
if(current_votes[ckey])
choices[choices[current_votes[ckey]]]--
if(vote && 1<=vote && vote<=choices.len)
voted += usr.ckey
choices[choices[vote]]++ //check this
current_votes[ckey] = vote
return vote
return 0
proc/initiate_vote(var/vote_type, var/initiator_key)
if(!mode)
if(started_timeofday != null)
var/next_allowed_timeofday = (started_timeofday + config.vote_delay)
if(world.timeofday < started_timeofday)
next_allowed_timeofday -= 864000
if(next_allowed_timeofday > world.timeofday)
if(started_time != null)
var/next_allowed_time = (started_time + config.vote_delay)
if(next_allowed_time > world.time)
return 0
reset()
switch(vote_type)
if("restart") choices.Add("Restart Round","Continue Playing")
if("gamemode") choices.Add(config.votable_modes)
if("restart")
choices.Add("Restart Round","Continue Playing")
if("gamemode")
if(ticker.current_state >= 2)
return 0
choices.Add(config.votable_modes)
if("crew_transfer")
if(ticker.current_state <= 2)
return 0
question = "End the shift?"
choices.Add("Initiate Crew Transfer", "Continue The Round")
if("custom")
question = html_encode(input(usr,"What is the vote for?") as text|null)
if(!question) return 0
@@ -156,7 +172,7 @@ datum/controller/vote
else return 0
mode = vote_type
initiator = initiator_key
started_timeofday = world.timeofday
started_time = world.time
var/text = "[capitalize(mode)] vote started by [initiator]."
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>"
@@ -179,10 +195,14 @@ datum/controller/vote
if(question) . += "<h2>Vote: '[question]'</h2>"
else . += "<h2>Vote: [capitalize(mode)]</h2>"
. += "Time Left: [time_remaining] s<hr><ul>"
for(var/i=1,i<=choices.len,i++)
for(var/i = 1, i <= choices.len, i++)
var/votes = choices[choices[i]]
if(!votes) votes = 0
. += "<li><a href='?src=\ref[src];vote=[i]'>[choices[i]]</a> ([votes] votes)</li>"
if(current_votes[C.ckey] == i)
. += "<li><b><a href='?src=\ref[src];vote=[i]'>[choices[i]]</a> ([votes] votes)</b></li>"
else
. += "<li><a href='?src=\ref[src];vote=[i]'>[choices[i]]</a> ([votes] votes)</li>"
. += "</ul><hr>"
if(admin)
. += "(<a href='?src=\ref[src];vote=cancel'>Cancel Vote</a>) "
@@ -193,6 +213,11 @@ datum/controller/vote
. += "<a href='?src=\ref[src];vote=restart'>Restart</a>"
else
. += "<font color='grey'>Restart (Disallowed)</font>"
. += "</li><li>"
if(trialmin || config.allow_vote_restart)
. += "<a href='?src=\ref[src];vote=crew_transfer'>Crew Transfer</a>"
else
. += "<font color='grey'>Crew Transfer (Disallowed)</font>"
if(trialmin)
. += "\t(<a href='?src=\ref[src];vote=toggle_restart'>[config.allow_vote_restart?"Allowed":"Disallowed"]</a>)"
. += "</li><li>"
@@ -235,11 +260,14 @@ datum/controller/vote
if("gamemode")
if(config.allow_vote_mode || usr.client.holder)
initiate_vote("gamemode",usr.key)
if("crew_transfer")
if(config.allow_vote_restart || usr.client.holder)
initiate_vote("crew_transfer",usr.key)
if("custom")
if(usr.client.holder)
initiate_vote("custom",usr.key)
else
submit_vote(round(text2num(href_list["vote"])))
submit_vote(usr.ckey, round(text2num(href_list["vote"])))
usr.vote()
+21 -17
View File
@@ -28,7 +28,9 @@
/obj/effect/datacore/proc/manifest_inject(var/mob/living/carbon/human/H)
if(H.mind && (H.mind.assigned_role != "MODE"))
var/assignment
if(H.mind.assigned_role)
if(H.mind.role_alt_title)
assignment = H.mind.role_alt_title
else if(H.mind.assigned_role)
assignment = H.mind.assigned_role
else if(H.job)
assignment = H.job
@@ -111,29 +113,31 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
var/g = "m"
if (H.gender == FEMALE)
g = "f"
var/icon/icobase
switch(H.get_species())
if("Tajaran")
preview_icon = new /icon('icons/effects/species.dmi', "tajaran_[g]_s")
preview_icon.Blend(new /icon('icons/effects/species.dmi', "tajtail_s"), ICON_OVERLAY)
icobase = 'icons/mob/human_races/r_tajaran.dmi'
if( "Soghun")
preview_icon = new /icon('icons/effects/species.dmi', "lizard_[g]_s")
preview_icon.Blend(new /icon('icons/effects/species.dmi', "sogtail_s"), ICON_OVERLAY)
icobase = 'icons/mob/human_races/r_lizard.dmi'
if("Skrell")
preview_icon = new /icon('icons/effects/species.dmi', "skrell_[g]_s")
icobase = 'icons/mob/human_races/r_skrell.dmi'
else
preview_icon = new /icon('human.dmi', "torso_[g]_s")
preview_icon.Blend(new /icon('human.dmi', "chest_[g]_s"), ICON_OVERLAY)
preview_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY)
preview_icon.Blend(new /icon('human.dmi', "head_[g]_s"), ICON_OVERLAY)
icobase = 'icons/mob/human_races/r_human.dmi'
for(var/datum/organ/external/E in H.organs)
if(E.status & ORGAN_CUT_AWAY) continue
preview_icon = new /icon(icobase, "torso_[g]")
var/icon/temp
temp = new /icon(icobase, "groin_[g]")
preview_icon.Blend(temp, ICON_OVERLAY)
temp = new /icon(icobase, "head_[g]")
preview_icon.Blend(temp, ICON_OVERLAY)
var/icon/temp = new /icon('human.dmi', "[E.name]_s")
if(E.status & ORGAN_ROBOT)
temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
preview_icon.Blend(temp, ICON_OVERLAY)
for(var/datum/organ/external/E in H.organs)
if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue
temp = new /icon(icobase, "[E.name]")
if(E.status & ORGAN_ROBOT)
temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
preview_icon.Blend(temp, ICON_OVERLAY)
// Skin tone
if(H.get_species() == "Human")
+6 -1
View File
@@ -1,6 +1,11 @@
/datum/organ
var/name = "organ"
var/mob/living/carbon/human/owner = null
var/list/datum/autopsy_data/autopsy_data = list()
var/list/trace_chemicals = list() // traces of chemicals in the organ,
// links chemical IDs to number of ticks for which they'll stay in the blood
///datum/organ/proc/process()
// return 0
@@ -12,4 +17,4 @@
return 0
proc/receive_chem(chemical as obj)
return 0
return 0
+70 -24
View File
@@ -5,6 +5,7 @@
name = "external"
var/icon_name = null
var/body_part = null
var/icon_position = 0
var/damage_state = "00"
var/brute_dam = 0
@@ -63,8 +64,7 @@
var/nux = brute * rand(10,15)
if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier)
if(prob(5 * brute))
status |= ORGAN_DESTROYED
droplimb()
droplimb(1)
return
else if(prob(nux))
@@ -75,8 +75,7 @@
else if(brute > 20)
if(config.limbs_can_break && brute_dam >= max_damage * config.organ_health_multiplier)
if(prob(5 * brute))
status |= ORGAN_DESTROYED
droplimb()
droplimb(1)
return
// If the limbs can break, make sure we don't exceed the maximum damage a limb can take before breaking
@@ -123,6 +122,8 @@
if(status & ORGAN_BROKEN)
owner.emote("scream")
if(used_weapon) add_autopsy_data(used_weapon, brute + burn)
owner.updatehealth()
// sync the organ's damage with its wounds
@@ -184,17 +185,18 @@
if(W.damage == 0 && W.created + 10 * 10 * 60 <= world.time)
wounds -= W
// let the GC handle the deletion of the wound
if(W.internal && !W.is_treated())
if(W.internal && !W.is_treated() && owner.bodytemperature >= 170)
// internal wounds get worse over time
W.open_wound(0.1 * wound_update_accuracy)
owner.vessel.remove_reagent("blood",0.2 * W.damage * wound_update_accuracy)
owner.vessel.remove_reagent("blood",0.07 * W.damage * wound_update_accuracy)
if(prob(1 * wound_update_accuracy))
owner.custom_pain("You feel a stabbing pain in your [display_name]!",1)
if(W.is_treated())
if(W.bandaged || W.salved)
// slow healing
var/amount = 0.2
if(W.bandaged) amount++
if(W.salved) amount++
if(W.disinfected) amount++
if(W.is_treated())
amount += 10
// amount of healing is spread over all the wounds
W.heal_damage((wound_update_accuracy * amount * W.amount * config.organ_regeneration_multiplier) / (20*owner.number_wounds+1))
@@ -318,10 +320,19 @@
return 1
return 0
proc/setAmputatedTree()
for(var/datum/organ/external/O in children)
O.amputated=amputated
O.setAmputatedTree()
proc/droplimb(var/override = 0,var/no_explode = 0)
if(destspawn) return
if(override)
status |= ORGAN_DESTROYED
if(status & ORGAN_DESTROYED)
if(body_part == UPPER_TORSO)
return
if(status & ORGAN_SPLINTED)
status &= ~ORGAN_SPLINTED
if(implant)
@@ -336,8 +347,8 @@
var/obj/item/weapon/organ/H
switch(body_part)
// if(UPPER_TORSO) just no.
// owner.gib()
// if(UPPER_TORSO)
// owner.gib()
if(LOWER_TORSO)
owner << "\red You are now sterile."
if(HEAD)
@@ -395,8 +406,25 @@
if(ismonkey(owner))
H.icon_state = "l_foot_l"
owner.u_equip(owner.shoes)
if(ismonkey(owner))
H.icon = 'monkey.dmi'
if(H)
if(ismonkey(owner))
H.icon = 'monkey.dmi'
else if(ishuman(owner) && owner.dna)
var/icon/I
switch(owner.dna.mutantrace)
if("tajaran")
I = new('icons/mob/human_races/r_tajaran.dmi')
if("lizard")
I = new('icons/mob/human_races/r_lizard.dmi')
if("skrell")
I = new('icons/mob/human_races/r_skrell.dmi')
else
I = new('icons/mob/human_races/r_human.dmi')
if(I)
H.icon = I.MakeLying()
else
H.icon_state = initial(H.icon_state)+"_l"
var/lol = pick(cardinal)
step(H,lol)
destspawn = 1
@@ -463,9 +491,11 @@
W = new wound_type(damage)
// Possibly trigger an internal wound, too.
if(damage > 10 && prob(damage))
var/local_damage = brute_dam + burn_dam + damage
if(damage > 10 && type != BURN && local_damage > 20 && prob(damage))
var/datum/wound/internal_bleeding/I = new (15)
wounds += I
owner.custom_pain("You feel something rip in your [display_name]!", 1)
// check whether we can add the wound to an existing wound
for(var/datum/wound/other in wounds)
@@ -520,6 +550,17 @@
if(T)
T.robotize()
proc/add_autopsy_data(var/used_weapon, var/damage)
var/datum/autopsy_data/W = autopsy_data[used_weapon]
if(!W)
W = new()
W.weapon = used_weapon
autopsy_data[used_weapon] = W
W.hits += 1
W.damage += damage
W.time_inflicted = world.time
/datum/organ/external/chest
name = "chest"
icon_name = "chest"
@@ -527,6 +568,7 @@
max_damage = 150
min_broken_damage = 75
body_part = UPPER_TORSO
var/ruptured_lungs = 0
/datum/organ/external/groin
name = "groin"
@@ -560,6 +602,7 @@
max_damage = 75
min_broken_damage = 30
body_part = LEG_LEFT
icon_position = LEFT
/datum/organ/external/r_arm
name = "r_arm"
@@ -576,6 +619,7 @@
max_damage = 75
min_broken_damage = 30
body_part = LEG_RIGHT
icon_position = RIGHT
/datum/organ/external/l_foot
name = "l_foot"
@@ -584,6 +628,7 @@
max_damage = 40
min_broken_damage = 15
body_part = FOOT_LEFT
icon_position = LEFT
/datum/organ/external/r_foot
name = "r_foot"
@@ -592,6 +637,7 @@
max_damage = 40
min_broken_damage = 15
body_part = FOOT_RIGHT
icon_position = RIGHT
/datum/organ/external/r_hand
name = "r_hand"
@@ -614,7 +660,7 @@
****************************************************/
obj/item/weapon/organ
icon = 'human.dmi'
icon = 'icons/mob/human_races/r_human.dmi'
obj/item/weapon/organ/New(loc, mob/living/carbon/human/H)
..(loc)
@@ -705,25 +751,25 @@ obj/item/weapon/organ/head/attackby(obj/item/weapon/W as obj, mob/user as mob)
obj/item/weapon/organ/l_arm
name = "left arm"
icon_state = "l_arm_l"
icon_state = "l_arm"
obj/item/weapon/organ/l_foot
name = "left foot"
icon_state = "l_foot_l"
icon_state = "l_foot"
obj/item/weapon/organ/l_hand
name = "left hand"
icon_state = "l_hand_l"
icon_state = "l_hand"
obj/item/weapon/organ/l_leg
name = "left leg"
icon_state = "l_leg_l"
icon_state = "l_leg"
obj/item/weapon/organ/r_arm
name = "right arm"
icon_state = "r_arm_l"
icon_state = "r_arm"
obj/item/weapon/organ/r_foot
name = "right foot"
icon_state = "r_foot_l"
icon_state = "r_foot"
obj/item/weapon/organ/r_hand
name = "right hand"
icon_state = "r_hand_l"
icon_state = "r_hand"
obj/item/weapon/organ/r_leg
name = "right leg"
icon_state = "r_leg_l"
icon_state = "r_leg"
+14
View File
@@ -1964,3 +1964,17 @@
icon_state = "capacitor"
desc = "A debug item for research."
origin_tech = "materials=8;programming=8;magnets=8;powerstorage=8;bluespace=8;combat=8;biotech=8;syndicate=8"
/obj/item/weapon/autopsy_scanner
name = "autopsy scanner"
desc = "Extracts information on wounds."
icon = 'icons/obj/autopsy_scanner.dmi'
icon_state = ""
flags = FPRINT | TABLEPASS | CONDUCT
w_class = 1.0
origin_tech = "materials=1;biotech=1"
/obj/item/weapon/autopsy_scanner/var/list/datum/autopsy_data_scanner/wdata = list()
/obj/item/weapon/autopsy_scanner/var/list/datum/autopsy_data_scanner/chemtraces = list()
/obj/item/weapon/autopsy_scanner/var/target_name = null
/obj/item/weapon/autopsy_scanner/var/timeofdeath = null
+4 -2
View File
@@ -260,5 +260,7 @@ proc/tg_list2text(list/list, glue=",")
return dir2text(angle2dir(degree))
//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]"
proc/worldtime2text(var/time = 0)
if(time == 0)
time = world.time
return "[round(time / 36000)+12]:[(time / 600 % 60) < 10 ? add_zero(time / 600 % 60, 1) : time / 600 % 60]"
+10
View File
@@ -7,6 +7,16 @@
#define TO_HEX_DIGIT(n) ascii2text((n&15) + ((n&15)<10 ? 48 : 87))
icon
proc/MakeLying()
var/icon/I = new(src,dir=SOUTH)
I.BecomeLying()
return I
proc/BecomeLying()
Turn(90)
Shift(SOUTH,6)
Shift(EAST,1)
// Multiply all alpha values by this float
proc/ChangeOpacity(opacity = 1.0)
MapColors(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,opacity, 0,0,0,0)
+1 -1
View File
@@ -123,7 +123,7 @@
D.open()
for (var/mob/living/silicon/ai/aiPlayer in player_list)
aiPlayer.cancelAlarm("Fire", src, src)
for (var/obj/machinery/computer/station_alert/a in player_list)
for (var/obj/machinery/computer/station_alert/a in world)
a.cancelAlarm("Fire", src, src)
return
+16 -7
View File
@@ -116,9 +116,10 @@
uni_identity = temp
var/mutstring = ""
for(var/i = 1, i <= 13, i++)
for(var/i = 1, i <= STRUCDNASIZE, i++)
mutstring += add_zero2(num2hex(rand(1,1024)),3)
struc_enzymes = mutstring
unique_enzymes = md5(character.real_name)
@@ -399,9 +400,17 @@
var/old_mutations = M.mutations
M.mutations = list()
M.see_in_dark = 2
M.see_invisible = 0
// M.see_in_dark = 2
// M.see_invisible = 0
if(PLANT in old_mutations)
M.mutations.Add(PLANT)
if(SKELETON in old_mutations)
M.mutations.Add(SKELETON)
if(FAT in old_mutations)
M.mutations.Add(FAT)
if(HUSK in old_mutations)
M.mutations.Add(HUSK)
if(ismuton(NOBREATHBLOCK,M))
if(probinj(45,inj) || (mNobreath in old_mutations))
@@ -478,9 +487,9 @@
if (isblockon(getblock(M.dna.struc_enzymes, XRAYBLOCK,3),XRAYBLOCK))
if(probinj(30,inj) || (XRAY in old_mutations))
M << "\blue The walls suddenly disappear."
M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
M.see_in_dark = 8
M.see_invisible = 2
// M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
// M.see_in_dark = 8
// M.see_invisible = 2
M.mutations.Add(XRAY)
if (isblockon(getblock(M.dna.struc_enzymes, NERVOUSBLOCK,3),NERVOUSBLOCK))
M.disabilities |= NERVOUS
@@ -1648,4 +1657,4 @@
src.add_fingerprint(usr)
src.updateUsrDialog()
return
/////////////////////////// DNA MACHINES
/////////////////////////// DNA MACHINES
+1 -1
View File
@@ -90,7 +90,7 @@ I decided to scrap round-specific objectives since keeping track of them would r
When I already created about 4 new objectives, this doesn't seem terribly important or needed.
*/
/var/global/toggle_space_ninja = 1//If ninjas can spawn or not.
/var/global/toggle_space_ninja = 0//If ninjas can spawn or not.
/var/global/sent_ninja_to_station = 0//If a ninja is already on the station.
/proc/space_ninja_arrival()
+5 -2
View File
@@ -52,7 +52,9 @@ var/global/datum/controller/gameticker/ticker
world << "<B><FONT color='blue'>Welcome to the pre-game lobby!</FONT></B>"
world << "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds"
while(current_state == GAME_STATE_PREGAME)
sleep(10)
for(var/i=0, i<10, i++)
sleep(1)
vote.process()
if(going)
pregame_timeleft--
@@ -300,7 +302,8 @@ var/global/datum/controller/gameticker/ticker
emergency_shuttle.process()
if(!mode.explosion_in_progress && mode.check_finished())
var/mode_finished = mode.check_finished() || (emergency_shuttle.location == 2 && emergency_shuttle.alert == 1)
if(!mode.explosion_in_progress && mode_finished)
current_state = GAME_STATE_FINISHED
spawn
+13
View File
@@ -474,6 +474,19 @@ datum/objective/steal
for(var/mob/living/silicon/ai/M in C)
if(istype(M, /mob/living/silicon/ai) && M.stat != 2) //See if any AI's are alive inside that card.
return 1
for(var/mob/living/silicon/ai/ai in world)
if(istype(ai.loc, /turf))
var/area/check_area = get_area(ai)
if(istype(check_area, /area/shuttle/escape/centcom))
return 1
if(istype(check_area, /area/shuttle/escape_pod1/centcom))
return 1
if(istype(check_area, /area/shuttle/escape_pod2/centcom))
return 1
if(istype(check_area, /area/shuttle/escape_pod3/centcom))
return 1
if(istype(check_area, /area/shuttle/escape_pod5/centcom))
return 1
else
for(var/obj/I in all_items) //Check for items
+1 -1
View File
@@ -499,7 +499,7 @@
// hack for alt titles
if(istype(loc, /mob))
var/mob/M = loc
if(M.mind.role_alt_title == jobName && M.mind.assigned_role in get_all_jobs())
if(M.mind && M.mind.role_alt_title == jobName && M.mind.assigned_role in get_all_jobs())
return M.mind.assigned_role
if(istype(src, /obj/item/device/pda))
+1 -1
View File
@@ -99,7 +99,7 @@
department_flag = ENGSEC
faction = "Station"
total_positions = 2
spawn_positions = 1
spawn_positions = 2
supervisors = "the chief engineer and research director"
selection_color = "#fff5cc"
+3
View File
@@ -62,6 +62,9 @@
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/virologist(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
if("Medical Doctor")
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit)
else
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit)
+7 -1
View File
@@ -235,6 +235,9 @@
else
dat += text("[]\tHealth %: [] ([])</FONT><BR>", (occupant.health > 50 ? "<font color='blue'>" : "<font color='red'>"), occupant.health, t1)
if(occupant.virus2)
dat += text("<font color='red'>Viral pathogen detected in blood stream.</font><BR>")
dat += text("[]\t-Brute Damage %: []</FONT><BR>", (occupant.getBruteLoss() < 60 ? "<font color='blue'>" : "<font color='red'>"), occupant.getBruteLoss())
dat += text("[]\t-Respiratory Damage %: []</FONT><BR>", (occupant.getOxyLoss() < 60 ? "<font color='blue'>" : "<font color='red'>"), occupant.getOxyLoss())
dat += text("[]\t-Toxin Content %: []</FONT><BR>", (occupant.getToxLoss() < 60 ? "<font color='blue'>" : "<font color='red'>"), occupant.getToxLoss())
@@ -279,9 +282,12 @@
var/bled = ""
var/splint = ""
var/internal_bleeding = ""
var/lung_ruptured = ""
for(var/datum/wound/W in e.wounds) if(W.internal)
internal_bleeding = "<br>Internal Bleeding"
break
if(istype(e, /datum/organ/external/chest) && e:ruptured_lungs)
lung_ruptured = "Lung Ruptured:"
if(e.status & ORGAN_SPLINTED)
splint = "Splinted:"
if(e.status & ORGAN_BLEEDING)
@@ -295,7 +301,7 @@
if(!AN && !open && !infected & !imp)
AN = "None:"
if(!(e.status & ORGAN_DESTROYED))
dat += "<td>[e.display_name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[bled][AN][splint][open][infected][imp][internal_bleeding]</td>"
dat += "<td>[e.display_name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured]</td>"
else
dat += "<td>[e.display_name]</td><td>-</td><td>-</td><td>Not Found</td>"
dat += "</tr>"
+6 -6
View File
@@ -820,14 +820,14 @@ Auto Patrol: []"},
projectile = /obj/item/projectile/energy/electrode
else if(lasercolor == "b")
if (src.emagged == 2)
projectile = /obj/item/projectile/beam/omnitag
projectile = /obj/item/projectile/beam/lastertag/omni
else
projectile = /obj/item/projectile/beam/bluetag
projectile = /obj/item/projectile/beam/lastertag/blue
else if(lasercolor == "r")
if (src.emagged == 2)
projectile = /obj/item/projectile/beam/omnitag
projectile = /obj/item/projectile/beam/lastertag/omni
else
projectile = /obj/item/projectile/beam/redtag
projectile = /obj/item/projectile/beam/lastertag/red
if (!( istype(U, /turf) ))
return
@@ -1011,7 +1011,7 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/bullet_act(var/obj/item/projectile/Proj)
if((src.lasercolor == "b") && (src.disabled == 0))
if(istype(Proj, /obj/item/projectile/beam/redtag))
if(istype(Proj, /obj/item/projectile/beam/lastertag/red))
src.disabled = 1
del (Proj)
sleep(100)
@@ -1019,7 +1019,7 @@ Auto Patrol: []"},
else
..()
else if((src.lasercolor == "r") && (src.disabled == 0))
if(istype(Proj, /obj/item/projectile/beam/bluetag))
if(istype(Proj, /obj/item/projectile/beam/lastertag/blue))
src.disabled = 1
del (Proj)
sleep(100)
+9 -6
View File
@@ -512,13 +512,16 @@
else if(istype(src,/obj/item/weapon/storage/firstaid/adv))
A.skin = "adv"
A.loc = user
if (user.r_hand == S)
user.u_equip(S)
user.r_hand = A
//A.loc = user
if(src.loc == user)
if (user.r_hand == S)
user.u_equip(S)
user.equip_to_slot_if_possible(A, slot_r_hand)
else
user.u_equip(S)
user.equip_to_slot_if_possible(A, slot_l_hand)
else
user.u_equip(S)
user.l_hand = A
A.loc = src.loc
A.layer = 20
user << "You add the robot arm to the first aid kit"
del(S)
+3 -2
View File
@@ -133,7 +133,7 @@
return 0
src.heal_level = rand(75,100) //Randomizes what health the clone is when ejected
src.heal_level = rand(0,40) //Randomizes what health the clone is when ejected
src.attempting = 1 //One at a time!!
src.locked = 1
@@ -190,7 +190,8 @@
randmutb(H) //Sometimes the clones come out wrong.
H.f_style = "Shaved"
H.h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
if(mrace == "none") //no more xenos losing ears/tentacles
H.h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
if(H.dna)
H.dna.mutantrace = mrace
+3 -2
View File
@@ -941,8 +941,9 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(se)
podman.dna.struc_enzymes = se
if(!prob(potency)) //if it fails, plantman!
if(podman.dna)
podman.dna.mutantrace = "plant"
if(podman)
// podman.dna.mutantrace = "plant"
podman.mutations.Add(PLANT)
podman.update_mutantrace()
else //else, one packet of seeds. maybe two
+6 -6
View File
@@ -76,8 +76,8 @@
// All energy-based weapons are applicable
switch(E.type)
if(/obj/item/weapon/gun/energy/laser/bluetag)
projectile = /obj/item/projectile/beam/bluetag
eprojectile = /obj/item/projectile/beam/omnitag//This bolt will stun ERRYONE with a vest
projectile = /obj/item/projectile/beam/lastertag/blue
eprojectile = /obj/item/projectile/beam/lastertag/omni//This bolt will stun ERRYONE with a vest
iconholder = null
reqpower = 100
lasercolor = "b"
@@ -90,8 +90,8 @@
shot_delay = 30
if(/obj/item/weapon/gun/energy/laser/redtag)
projectile = /obj/item/projectile/beam/redtag
eprojectile = /obj/item/projectile/beam/omnitag
projectile = /obj/item/projectile/beam/lastertag/red
eprojectile = /obj/item/projectile/beam/lastertag/omni
iconholder = null
reqpower = 100
lasercolor = "r"
@@ -375,13 +375,13 @@ Status: []<BR>"},
if (src.health <= 0)
src.die() // the death process :(
if((src.lasercolor == "b") && (src.disabled == 0))
if(istype(Proj, /obj/item/projectile/beam/redtag))
if(istype(Proj, /obj/item/projectile/beam/lastertag/red))
src.disabled = 1
del (Proj)
sleep(100)
src.disabled = 0
if((src.lasercolor == "r") && (src.disabled == 0))
if(istype(Proj, /obj/item/projectile/beam/bluetag))
if(istype(Proj, /obj/item/projectile/beam/lastertag/blue))
src.disabled = 1
del (Proj)
sleep(100)
+2 -2
View File
@@ -221,9 +221,9 @@
if(4)
A = new /obj/item/projectile/change( loc )
if(5)
A = new /obj/item/projectile/beam/bluetag( loc )
A = new /obj/item/projectile/beam/lastertag/blue( loc )
if(6)
A = new /obj/item/projectile/beam/redtag( loc )
A = new /obj/item/projectile/beam/lastertag/red( loc )
A.original = target.loc
use_power(500)
else
+8 -4
View File
@@ -123,12 +123,12 @@ MASS SPECTROMETER
TX = M.getToxLoss() > 50 ? "<font color='green'><b>Dangerous amount of toxins detected</b></font>" : "Subject bloodstream toxin level minimal"
BU = M.getFireLoss() > 50 ? "<font color='#FFA500'><b>Severe burn damage detected</b></font>" : "Subject burn injury status O.K"
BR = M.getBruteLoss() > 50 ? "<font color='red'><b>Severe anatomical damage detected</b></font>" : "Subject brute-force injury status O.K"
if(M.status_flags & FAKEDEATH)
if(M.status_flags & FAKEDEATH)
OX = fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal"
user.show_message("[OX] | [TX] | [BU] | [BR]")
if (istype(M, /mob/living/carbon/human))
if(M:virus2 || M:reagents.total_volume > 0)
user.show_message(text("\red Warning: Unknown substance detected in subject's blood."))
user.show_message(text("\red Warning: Unknown substance detected in subject's blood."))
if (M.getCloneLoss())
user.show_message("\red Subject appears to have been imperfectly cloned.")
for(var/datum/disease/D in M.viruses)
@@ -152,17 +152,21 @@ MASS SPECTROMETER
user << "\red Unsecured fracture in subject [limb]. Splinting recommended for transport."
if(e.is_infected())
user << "\red Infected wound detected in subject [limb]. Disinfection recommended."
for(var/name in H.organs_by_name)
var/datum/organ/external/e = H.organs_by_name[name]
if(e.status & ORGAN_BROKEN)
user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1)
break
for(var/datum/organ/external/e in H.organs)
for(var/datum/wound/W in e.wounds) if(W.internal)
user.show_message(text("\red Internal bleeding detected. Advanced scanner required for location."), 1)
break
if(M:vessel)
var/blood_volume = round(M:vessel.get_reagent_amount("blood"))
var/blood_percent = blood_volume / 560
blood_percent *= 100
if(blood_volume <= 448)
if(blood_volume <= 500)
user.show_message("\red <b>Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl")
else if(blood_volume <= 336)
user.show_message("\red <b>Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl")
@@ -124,8 +124,8 @@
usr << "<span class='notice'>You can't clear the memory while playing or recording!</span>"
return
else
storedinfo -= storedinfo
timestamp -= timestamp
if(storedinfo) storedinfo.Cut()
if(timestamp) timestamp.Cut()
timerecorded = 0
usr << "<span class='notice'>Memory cleared.</span>"
return
@@ -1,269 +1,148 @@
/obj/item/weapon/grenade/chem_grenade
name = "Grenade Casing"
icon_state = "chemg"
icon = 'chemical.dmi'
item_state = "flashbang"
desc = "A hand made chemical grenade."
w_class = 2.0
force = 2.0
var/list/beakers = list()
var/obj/item/device/assembly/attached_device
var/exploding = 0
var/stage = 0
var/state = 0
var/path = 0
var/motion = 0
var/direct = "SOUTH"
var/obj/item/weapon/circuitboard/circuit = null
var/list/allowed_containers = list("/obj/item/weapon/reagent_containers/glass/beaker", "/obj/item/weapon/reagent_containers/glass/dispenser", "/obj/item/weapon/reagent_containers/glass/bottle")
var/obj/item/device/assembly_holder/detonator = null
var/list/beakers = new/list()
var/list/allowed_containers = list(/obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle)
var/affected_area = 3
var/mob/attacher = "Unknown"
throw_speed = 4
throw_range = 20
flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY
slot_flags = SLOT_BELT
attackby(var/obj/item/weapon/W, var/mob/user)
if(path || !active)
switch(active)
if(0)
if(istype(W, /obj/item/device/assembly/igniter))
active = 1
icon_state = initial(icon_state) +"_ass"
name = "unsecured grenade"
path = 1
del(W)
if(1)
if(istype(W, /obj/item/weapon/reagent_containers/glass))
if(beakers.len == 2)
user << "\red There are already two beakers inside, remove one first!"
return
beakers |= W
user.drop_item()
W.loc = src
user << "\blue You insert the beaker into the casing."
else if(istype(W, /obj/item/device/assembly/signaler) || istype(W, /obj/item/device/assembly/timer) || istype(W, /obj/item/device/assembly/infra) || istype(W, /obj/item/device/assembly/prox_sensor))
if(attached_device)
user << "\red There is already an device attached to the controls, remove it first!"
return
attached_device = W
user.drop_item()
W.loc = src
user << "\blue You attach the [W] to the grenade controls!"
W.master = src
bombers += "[key_name(user)] attached a [W] to a grenade casing."
message_admins("[key_name_admin(user)] attached a [W] to a grenade casing.")
log_game("[key_name_admin(user)] attached a [W] to a grenade casing.")
attacher = key_name(user)
else if(istype(W, /obj/item/weapon/screwdriver))
if(beakers.len == 2 && attached_device)
user << "\blue You lock the assembly."
playsound(src.loc, 'Screwdriver.ogg', 25, -3)
name = "grenade"
icon_state = initial(icon_state) + "_locked"
active = 2
path = 1
else
user << "\red You need to add all components before locking the assembly."
if(2)
if(istype(W, /obj/item/weapon/screwdriver))
user << "\blue You disarm the [src]!"
playsound(src.loc, 'Screwdriver.ogg', 25, -3)
name = "grenade casing"
icon_state = initial(icon_state) +"_ass"
active = 1
path = 1
if(path != 1)
if(!istype(src.loc,/turf))
user << "\red You need to put the canister on the ground to do that!"
else
switch(state)
if(0)
if(istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'Ratchet.ogg', 50, 1)
if(do_after(user, 20))
user << "\blue You wrench the canister in place."
src.name = "Camera Assembly"
src.anchored = 1
src.state = 1
path = 2
if(1)
if(istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'Ratchet.ogg', 50, 1)
if(do_after(user, 20))
user << "\blue You unfasten the canister."
src.name = "Grenade Casing"
src.anchored = 0
src.state = 0
path = 0
if(istype(W, /obj/item/device/multitool))
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
user << "\blue You place the electronics inside the canister."
src.circuit = W
user.drop_item()
W.loc = src
if(istype(W, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
user << "\blue You screw the circuitry into place."
src.state = 2
if(istype(W, /obj/item/weapon/crowbar) && circuit)
playsound(src.loc, 'Crowbar.ogg', 50, 1)
user << "\blue You remove the circuitry."
src.state = 1
circuit.loc = src.loc
src.circuit = null
if(2)
if(istype(W, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
user << "\blue You unfasten the circuitry."
src.state = 1
if(istype(W, /obj/item/weapon/cable_coil))
if(W:amount >= 1)
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
if(do_after(user, 20))
W:amount -= 1
if(!W:amount) del(W)
user << "\blue You add cabling to the canister."
src.state = 3
if(3)
if(istype(W, /obj/item/weapon/wirecutters))
playsound(src.loc, 'wirecutter.ogg', 50, 1)
user << "\blue You remove the cabling."
src.state = 2
var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( src.loc )
A.amount = 1
if(issignaler(W))
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
user << "\blue You attach the wireless signaller unit to the circutry."
user.drop_item()
W.loc = src
src.state = 4
if(4)
if(istype(W, /obj/item/weapon/crowbar) && !motion)
playsound(src.loc, 'Crowbar.ogg', 50, 1)
user << "\blue You remove the remote signalling device."
src.state = 3
var/obj/item/device/assembly/signaler/S = locate() in src
if(S)
S.loc = src.loc
else
new /obj/item/device/assembly/signaler( src.loc, 1 )
if(isprox(W) && motion == 0)
// if(W:amount >= 1)
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
// W:use(1)
user << "\blue You attach the proximity sensor."
user.drop_item()
W.loc = src
motion = 1
if(istype(W, /obj/item/weapon/crowbar) && motion)
playsound(src.loc, 'Crowbar.ogg', 50, 1)
user << "\blue You remove the proximity sensor."
var/obj/item/device/assembly/prox_sensor/S = locate() in src
if(S)
S.loc = src.loc
else
new /obj/item/device/assembly/prox_sensor( src.loc, 1 )
motion = 0
if(istype(W, /obj/item/stack/sheet/glass))
if(W:amount >= 1)
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
if(do_after(user, 20))
if(W)
W:use(1)
user << "\blue You put in the glass lens."
src.state = 5
if(5)
if(istype(W, /obj/item/weapon/crowbar))
playsound(src.loc, 'Crowbar.ogg', 50, 1)
user << "\blue You remove the glass lens."
src.state = 4
new /obj/item/stack/sheet/glass( src.loc, 2 )
if(istype(W, /obj/item/weapon/screwdriver))
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
user << "\blue You connect the lense."
var/B
if(motion == 1)
B = new /obj/machinery/camera/motion( src.loc )
else
B = new /obj/machinery/camera( src.loc )
B:network = "SS13"
B:network = input(usr, "Which network would you like to connect this camera to?", "Set Network", "SS13")
direct = input(user, "Direction?", "Assembling Camera", null) in list( "NORTH", "EAST", "SOUTH", "WEST" )
B:dir = text2dir(direct)
del(src)
return
New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
attack_self(mob/user as mob)
if(active == 2)
attached_device.attack_self(user)
return
user.machine = src
var/dat = {"<B> Grenade properties: </B>
<BR> <B> Beaker one:</B> [beakers[1]] [beakers[1] ? "<A href='?src=\ref[src];beakerone=1'>Remove</A>" : ""]
<BR> <B> Beaker two:</B> [beakers[2]] [beakers[2] ? "<A href='?src=\ref[src];beakertwo=1'>Remove</A>" : ""]
<BR> <B> Control attachment:</B> [attached_device ? "<A href='?src=\ref[src];device=1'>[attached_device]</A>" : "None"] [attached_device ? "<A href='?src=\ref[src];rem_device=1'>Remove</A>" : ""]"}
if(!stage || stage==1)
if(detonator)
// detonator.loc=src.loc
detonator.detached()
usr.put_in_hands(detonator)
detonator=null
stage=0
icon_state = initial(icon_state)
else if(beakers.len)
for(var/obj/B in beakers)
if(istype(B))
beakers -= B
user.put_in_hands(B)
name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]"
if(stage > 1 && !active && clown_check(user))
user << "<span class='warning'>You prime \the [name]!</span>"
log_attack("<font color='red'>[user.name] ([user.ckey]) primed \a [src].</font>")
log_admin("ATTACK: [user] ([user.ckey]) primed \a [src].")
message_admins("ATTACK: [user] ([user.ckey]) primed \a [src].")
activate()
add_fingerprint(user)
if(iscarbon(user))
var/mob/living/carbon/C = user
C.throw_mode_on()
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/device/assembly_holder) && (!stage || stage==1) && path != 2)
var/obj/item/device/assembly_holder/det = W
if(istype(det.a_left,det.a_right.type) || (!isigniter(det.a_left) && !isigniter(det.a_right)))
user << "\red Assembly must contain one igniter."
return
if(!det.secured)
user << "\red Assembly must be secured with screwdriver."
return
path = 1
user << "\blue You add [W] to the metal casing."
playsound(src.loc, 'sound/items/Screwdriver2.ogg', 25, -3)
user.remove_from_mob(det)
det.loc = src
detonator = det
icon_state = initial(icon_state) +"_ass"
name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]"
stage = 1
else if(istype(W,/obj/item/weapon/screwdriver) && path != 2)
if(stage == 1)
path = 1
if(beakers.len)
user << "\blue You lock the assembly."
name = "grenade"
else
// user << "\red You need to add at least one beaker before locking the assembly."
user << "\blue You lock the empty assembly."
name = "fake grenade"
playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3)
icon_state = initial(icon_state) +"_locked"
stage = 2
else if(stage == 2)
if(active && prob(95))
user << "\red You trigger the assembly!"
prime()
return
else
user << "\blue You unlock the assembly."
playsound(src.loc, 'sound/items/Screwdriver.ogg', 25, -3)
name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]"
icon_state = initial(icon_state) + (detonator?"_ass":"")
stage = 1
active = 0
else if(is_type_in_list(W, allowed_containers) && (!stage || stage==1) && path != 2)
path = 1
if(beakers.len == 2)
user << "\red The grenade can not hold more containers."
return
else
if(W.reagents.total_volume)
user << "\blue You add \the [W] to the assembly."
user.drop_item()
W.loc = src
beakers += W
stage = 1
name = "unsecured grenade with [beakers.len] containers[detonator?" and detonator":""]"
else
user << "\red \the [W] is empty."
examine()
set src in usr
usr << desc
if(detonator)
usr << "With attached [detonator.name]"
activate(mob/user as mob)
if(active) return
if(detonator)
if(!isigniter(detonator.a_left))
detonator.a_left.activate()
active = 1
if(!isigniter(detonator.a_right))
detonator.a_right.activate()
active = 1
if(active)
icon_state = initial(icon_state) + "_active"
if(user)
log_attack("<font color='red'>[user.name] ([user.ckey]) primed \a [src]</font>")
log_admin("ATTACK: [user] ([user.ckey]) primed \a [src]")
message_admins("ATTACK: [user] ([user.ckey]) primed \a [src]")
user << browse(dat, "window=trans_valve;size=600x300")
onclose(user, "trans_valve")
return
proc/primed(var/primed = 1)
if(active)
icon_state = initial(icon_state) + (primed?"_primed":"_active")
Topic(href, href_list)
..()
if (usr.stat || usr.restrained())
return
if (src.loc == usr)
if(href_list["beakerone"])
if(beakers.len < 1)
return
var/obj/b1 = beakers[1]
b1.loc = get_turf(src)
beakers.Remove(b1)
if(href_list["beakertwo"])
if(beakers.len < 2)
return
var/obj/b2 = beakers[2]
b2.loc = get_turf(src)
beakers.Remove(b2)
if(href_list["rem_device"])
attached_device.loc = get_turf(src)
attached_device = null
if(href_list["device"])
attached_device.attack_self(usr)
src.attack_self(usr)
src.add_fingerprint(usr)
return
receive_signal(signal)
if(!(active == 2))
return //cant go off before it gets primed
explode()
HasProximity(atom/movable/AM as mob|obj)
if(istype(attached_device, /obj/item/device/assembly/prox_sensor))
var/obj/item/device/assembly/prox_sensor/D = attached_device
if (istype(AM, /obj/effect/beam))
return
if (AM.move_speed < 12)
D.sense()
proc/explode()
if(exploding) return
exploding = 1
prime()
if(!stage || stage<2) return
//if(prob(reliability))
var/has_reagents = 0
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
if(G.reagents.total_volume)
has_reagents = 1
break
if(G.reagents.total_volume) has_reagents = 1
active = 0
if(!has_reagents)
@@ -271,18 +150,11 @@
playsound(src.loc, 'sound/items/Screwdriver2.ogg', 50, 1)
return
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
playsound(src.loc, 'sound/effects/bamf.ogg', 50, 1)
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
G.reagents.trans_to(src, G.reagents.total_volume)
var/obj/item/weapon/reagent_containers/glass/G = locate() in beakers
reagents.trans_to(G, reagents.total_volume/2)
if(src.reagents.total_volume) //The possible reactions didnt use up all reagents.
var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread()
steam.set_up(10, 0, get_turf(src))
@@ -293,10 +165,6 @@
if( A == src ) continue
src.reagents.reaction(A, 1, 10)
for(var/atom/A in view(affected_area, src.loc))
if( A == src ) continue
G.reagents.reaction(A, 1, 10)
invisibility = INVISIBILITY_MAXIMUM //Why am i doing this?
spawn(50) //To make sure all reagents can work
@@ -307,19 +175,12 @@
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
G.loc = get_turf(src.loc)*/
proc/c_state(var/i = 0)
if(i)
icon_state = initial(icon_state) + "_armed"
else
icon_state = initial(icon_state) + "_locked"
return
/obj/item/weapon/grenade/chem_grenade/large
name = "Large Chem Grenade"
desc = "An oversized grenade that affects a larger area."
icon_state = "large_grenade"
allowed_containers = list("/obj/item/weapon/reagent_containers/glass")
allowed_containers = list(/obj/item/weapon/reagent_containers/glass)
origin_tech = "combat=3;materials=3"
affected_area = 4
@@ -327,13 +188,10 @@
name = "Metal-Foam Grenade"
desc = "Used for emergency sealing of air breaches."
path = 1
active = 2
stage = 2
New()
..()
attached_device = new /obj/item/device/assembly/timer(src)
attached_device.master = src
attached_device.toggle_secure()
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
@@ -341,41 +199,41 @@
B2.reagents.add_reagent("foaming_agent", 10)
B2.reagents.add_reagent("pacid", 10)
beakers.Add(B1, B2)
icon_state = "chemg_locked"
detonator = new/obj/item/device/assembly_holder/timer_igniter(src)
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
/obj/item/weapon/grenade/chem_grenade/incendiary
name = "Incendiary Grenade"
desc = "Used for clearing rooms of living things."
path = 1
active = 2
stage = 2
New()
..()
attached_device = new /obj/item/device/assembly/timer(src)
attached_device.master = src
attached_device.toggle_secure()
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)
B2.reagents.add_reagent("plasma", 25)
B2.reagents.add_reagent("acid", 25)
B2.reagents.add_reagent("sacid", 25)
beakers.Add(B1, B2)
icon_state = "chemg_locked"
detonator = new/obj/item/device/assembly_holder/timer_igniter(src)
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
/obj/item/weapon/grenade/chem_grenade/cleaner
name = "Cleaner Grenade"
desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas."
active = 2
stage = 2
path = 1
New()
..()
attached_device = new /obj/item/device/assembly/timer(src)
attached_device.master = src
attached_device.toggle_secure()
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
@@ -383,5 +241,8 @@
B2.reagents.add_reagent("water", 40)
B2.reagents.add_reagent("cleaner", 10)
beakers.Add(B1, B2)
icon_state = "chemg_locked"
detonator = new/obj/item/device/assembly_holder/timer_igniter(src)
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
+4 -5
View File
@@ -86,13 +86,12 @@
else
H.Stun(time)
if(H.stat != 2) H.stat = 1
for(var/mob/O in viewers(H, null))
O.show_message(text("\red <B>[] has been knocked unconscious!</B>", H), 1, "\red You hear someone fall.", 2)
user.visible_message("\red <B>[H] has been knocked unconscious!</B>", "\red <B>You knock [H] unconscious!</B>")
return
else
H << text("\red [] tried to knock you unconscious!",user)
H.visible_message("\red [user] tried to knock [H] unconscious!", "\red [user] tried to knock you unconscious!")
H.eye_blurry += 3
return
return ..()
/*
* Trays - Agouri
+2 -2
View File
@@ -589,7 +589,7 @@
</head>
<body>
<iframe width='100%' height='97%' src="http://nanotrasen.com/wiki/index.php?title=Space_Law&printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe>
<iframe width='100%' height='97%' src="http://baystation12.net/wiki/index.php?title=Space_law&printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe>
</body>
</html>
@@ -607,7 +607,7 @@
</head>
<body>
<iframe width='100%' height='97%' src="http://nanotrasen.com/wiki/index.php?title=Guide_to_engineering&printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe>
<iframe width='100%' height='97%' src="http://baystation12.net/wiki/index.php?title=Guide_to_engineering&printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe>
</body>
</html>
@@ -289,6 +289,9 @@
W.dropped(user)
user << "\red God damnit!"
if(istype(W, /obj/item/weapon/packageWrap) && !(src in user)) //prevents package wrap being put inside the backpack when the backpack is not being worn/held (hence being wrappable)
return
handle_item_insertion(W)
return
+2 -1
View File
@@ -396,7 +396,8 @@
/obj/item/weapon/weldingtool/attack(mob/M as mob, mob/user as mob)
if(hasorgans(M))
var/datum/organ/external/S = M:organs[user.zone_sel.selecting]
var/datum/organ/external/S = M:organs_by_name[user.zone_sel.selecting]
if (!S) return
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help")
return ..()
if(S.brute_dam)
+11 -1
View File
@@ -19,7 +19,7 @@
if (vary)
S.frequency = rand(32000, 55000)
for (var/mob/M in range(world.view+extrarange, source)) // Plays for people in range.
for (var/mob/M in range(world.view+extrarange, source)) // Plays for people in range.
if(locate(/mob/, M))
var/mob/M2 = locate(/mob/, M)
if (M2.client)
@@ -48,6 +48,16 @@
S.pan = max(-100, min(100, dx/8.0 * 100))
M << S
for(var/obj/mecha/mech in range(world.view+extrarange, source))
var/mob/M = mech.occupant
if (M && M.client)
if(M.ear_deaf <= 0 || !M.ear_deaf)
if(isturf(source))
var/dx = source.x - M.x
S.pan = max(-100, min(100, dx/8.0 * 100))
M << S
// Now plays for people in lockers! -- Polymorph
/mob/proc/playsound_local(var/atom/source, soundin, vol as num, vary, extrarange as num)
+2
View File
@@ -129,6 +129,8 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an", "monkey", "ali
send2irc(ckey, "[original_msg] - No admins online")
else
send2irc(ckey, "[original_msg] - All admins AFK ([admin_number_afk])")
else
send2irc(ckey, original_msg)
feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
+1 -1
View File
@@ -25,7 +25,7 @@
for (var/client/C in admin_list)
if (src.holder.rank == "Admin Observer")
C << "<span class='adminobserver'><span class='prefix'>ADMIN:</span> <EM>[key_name(usr, C)]:</EM> <span class='message'>[msg]</span></span>"
else if(C.holder.level != 0)
else if(C.holder && C.holder.level != 0)
C << "<span class='admin'><span class='prefix'>ADMIN:</span> <EM>[key_name(usr, C)]</EM> (<A HREF='?src=\ref[C.holder];adminplayerobservejump=\ref[mob]'>JMP</A>): <span class='message'>[msg]</span></span>"
/client/proc/cmd_mod_say(msg as text)
-2
View File
@@ -71,8 +71,6 @@
holder.process_activation(src, 1, 0)
if(holder && (wires & WIRE_PULSE_SPECIAL))
holder.process_activation(src, 0, 1)
if(master && (wires & WIRE_PULSE))
master.receive_signal("activate")
// if(radio && (wires & WIRE_RADIO_PULSE))
//Not sure what goes here quite yet send signal?
return 1
+3
View File
@@ -231,6 +231,9 @@
if ( !(usr.stat || usr.restrained()) )
var/obj/item/device/assembly_holder/holder
if(istype(src,/obj/item/weapon/grenade/chem_grenade))
var/obj/item/weapon/grenade/chem_grenade/gren = src
holder=gren.detonator
var/obj/item/device/assembly/timer/tmr = holder.a_left
if(!istype(tmr,/obj/item/device/assembly/timer))
tmr = holder.a_right
+1 -1
View File
@@ -104,7 +104,7 @@
holder.update_icon()
if(holder && istype(holder.loc,/obj/item/weapon/grenade/chem_grenade))
var/obj/item/weapon/grenade/chem_grenade/grenade = holder.loc
grenade.c_state(scanning)
grenade.primed(scanning)
return
+1 -1
View File
@@ -31,7 +31,7 @@
spawn(10)
process_cooldown()
// signal()
signal()
return 1
update_icon()
+4 -4
View File
@@ -249,16 +249,16 @@ BLIND // can't see anything
H.holstered = usr.get_active_hand()
usr.drop_item()
H.holstered.loc = src
usr.visible_message("\blue [usr] holsters \the [H.holstered].", "You holster \the [H.holstered].")
usr.visible_message("\blue \The [usr] holsters \the [H.holstered].", "You holster \the [H.holstered].")
else
if(istype(usr.get_active_hand(),/obj) && istype(usr.get_inactive_hand(),/obj))
usr << "\red You need an empty hand to draw the gun!"
else
if(usr.a_intent == "hurt")
usr.visible_message("\red [usr] draws \the [H.holstered], ready to shoot!", \
usr.visible_message("\red \The [usr] draws \the [H.holstered], ready to shoot!", \
"\red You draw \the [H.holstered], ready to shoot!")
else
usr.visible_message("\blue [usr] draws \the [H.holstered], pointing it at the ground.", \
"\blue You draw \the [H.holstered], pointing it at tthe ground.")
usr.visible_message("\blue \The [usr] draws \the [H.holstered], pointing it at the ground.", \
"\blue You draw \the [H.holstered], pointing it at the ground.")
usr.put_in_hands(H.holstered)
H.holstered = null
+71 -34
View File
@@ -61,6 +61,11 @@
icon_state = "paper"
item_state = "paper"
/obj/item/fluff/maurice_bedford_1
name = "Monogrammed Handkerchief"
desc = "A neatly folded handkerchief embroidered with a 'M'."
icon_state = "maurice_bedford_1"
//////////////////////////////////
////////// Usable Items //////////
//////////////////////////////////
@@ -75,6 +80,12 @@
icon = 'custom_items.dmi'
icon_state = "fancypen"
/obj/item/weapon/pen/fluff/fountainpen //paththegreat: Eli Stevens
name = "Engraved Fountain Pen"
desc = "An expensive looking pen with the initials E.S. engraved into the side."
icon = 'custom_items.dmi'
icon_state = "fountainpen"
/obj/item/fluff/victor_kaminsky_1 //chinsky: Victor Kaminski
name = "golden detective's badge"
desc = "NanoTrasen Security Department detective's badge, made from gold. Badge number is 564."
@@ -137,6 +148,14 @@
icon_on = "gonzozippoon"
icon_off = "gonzozippo"
/obj/item/weapon/lighter/zippo/fluff/naples_1 //naples: Russell Vierson
name = "Engraved zippo"
desc = "A intricately engraved Zippo lighter."
icon = 'custom_items.dmi'
icon_state = "engravedzippo"
icon_on = "engravedzippoon"
icon_off = "engravedzippo"
/obj/item/weapon/fluff/cado_keppel_1 //sparklysheep: Cado Keppel
name = "purple comb"
desc = "A pristine purple comb made from flexible plastic. It has a small K etched into its side."
@@ -177,6 +196,21 @@
icon_state = "shinyflask"
volume = 50
/obj/item/weapon/reagent_containers/food/drinks/flask/fluff/lithiumflask //mcgulliver: Wox Derax
name = "Lithium Flask"
desc = "A flask with a Lithium Atom symbol on it."
icon = 'custom_items.dmi'
icon_state = "lithiumflask"
volume = 50
/obj/item/weapon/reagent_containers/glass/beaker/large/fluff/nashida_bishara_1 //rukral:Nashida Bisha'ra
name = "Nashida's Etched Beaker"
desc = "The message: 'Please do not be removing this beaker from the chemistry lab. If lost, return to Nashida Bisha'ra' can be seen etched into the side of this 100 unit beaker."
icon = 'icons/obj/chemical.dmi'
icon_state = "beakerlarge"
g_amt = 5000
volume = 100
/obj/item/weapon/storage/pill_bottle/fluff/listermedbottle //compactninja: Lister Black
name = "Pill bottle (anti-depressants)"
desc = "Contains pills used to deal with depression. They appear to be prescribed to Lister Black"
@@ -272,7 +306,7 @@
icon = 'custom_items.dmi'
icon_state = "odysseus_spec_id"
/obj/item/weapon/card/id/fluff/ian_colmid //Roaper: Ian Colm
/obj/item/weapon/card/id/fluff/ian_colm_1 //Roaper: Ian Colm
name = "Technician"
desc = "An old ID with the words 'Ian Colm's Technician ID' printed on it.."
icon = 'custom_items.dmi'
@@ -324,6 +358,12 @@
item_state = "bluegloves"
color="blue"
/obj/item/clothing/gloves/fluff/chal_appara_1 //furlucis: Chal Appara
name = "Left Black Glove"
desc = "The left one of a pair of black gloves. Wonder where the other one went..."
icon = 'custom_items.dmi'
icon_state = "chal_appara_1"
//////////// Eye Wear ////////////
/obj/item/clothing/glasses/meson/fluff/book_berner_1 //asanadas: Book Berner
@@ -332,22 +372,19 @@
icon = 'custom_items.dmi'
icon_state = "book_berner_1"
/obj/item/clothing/glasses/fluff/serithi_artalis_1 //serithi: Serithi Artalis
name = "extranet HUD"
desc = "A heads-up display with limited connectivity to the NanoTrasen Extranet, capable of displaying information from official NanoTrasen records."
/obj/item/clothing/glasses/fluff/uzenwa_sissra_1 //sparklysheep: Uzenwa Sissra
name = "Scanning Goggles"
desc = "A very oddly shaped pair of goggles with bits of wire poking out the sides. A soft humming sound emanates from it."
icon = 'custom_items.dmi'
icon_state = "serithi_artalis_1"
icon_state = "uzenwa_sissra_1"
/obj/item/clothing/glasses/welding/fluff/ian_colm_2 //roaper: Ian Colm
name = "Ian's Goggles"
desc = "A pair of goggles used in the application of welding."
icon = 'custom_items.dmi'
icon_state = "ian_colm_1"
//////////// Hats ////////////
//Removed by request
/*
/obj/item/clothing/head/helmet/hardhat/fluff/greg_anderson_1 //deusdactyl: Greg Anderson
name = "old hard hat"
desc = "An old dented hard hat with the nametag \"Anderson\". It seems to be backwards."
icon_state = "hardhat0_dblue" //Already an in-game sprite
item_state = "hardhat0_dblue"
color = "dblue"
*/
/obj/item/clothing/head/secsoft/fluff/swatcap //deusdactyl: James Girard
name = "\improper SWAT hat"
@@ -379,12 +416,6 @@
icon = 'custom_items.dmi'
icon_state = "taryn_kifer_1"
/obj/item/clothing/head/fluff/enos_adlai_1 //roaper: Enos Adlai
name = "comfy cap"
desc = "Because when you're the toughest Mother Hubbard on the station, nobody's criticizing your fashion sense."
icon = 'custom_items.dmi'
icon_state = "enos_adlai_1"
/obj/item/clothing/head/fluff/edvin_telephosphor_1 //foolamancer: Edvin Telephosphor
name = "Edvin's Hat"
desc = "A hat specially tailored for Skrellian anatomy. It has a yellow badge on the front, with a large red 'T' inscribed on it."
@@ -493,25 +524,31 @@
//////////// Shoes ////////////
/obj/item/clothing/shoes/fluff/leatherboots //serithi: Serithi Artalis
name = "leather boots"
desc = "A pair of leather boots. Well-worn, but still kept in good condition. There is a small \"S\" scratched into the back of each boot."
/obj/item/clothing/shoes/magboots/fluff/susan_harris_1 //sniperyeti: Susan Harris
name = "Susan's Magboots"
desc = "A colorful pair of magboots with the name Susan Harris clearly written on the back."
icon = 'custom_items.dmi'
icon_state = "leatherboots"
item_state = "jackboots"
icon_state = "atmosmagboots0"
verb/toggle()
set name = "Toggle Magboots"
set category = "Object"
set src in usr
if(src.magpulse)
src.flags &= ~NOSLIP
src.slowdown = SHOES_SLOWDOWN
src.magpulse = 0
icon_state = "atmosmagboots0"
usr << "You disable the mag-pulse traction system."
else
src.flags |= NOSLIP
src.slowdown = 2
src.magpulse = 1
icon_state = "atmosmagboots1"
usr << "You enable the mag-pulse traction system."
//////////// Sets ////////////
////// CDC //deusdactyl: Roger Wiles
//Removed by request.
/*
/obj/item/clothing/under/rank/virologist/fluff/cdc_jumpsuit
name = "\improper CDC jumpsuit"
desc = "A modified standard-issue CDC jumpsuit made of a special fiber that gives special protection against biohazards. It has a biohazard symbol sewn into the back."
icon = 'custom_items.dmi'
icon_state = "cdc_jumpsuit"
color = "cdc_jumpsuit"
/obj/item/clothing/suit/labcoat/fluff/cdc_labcoat
name = "\improper CDC labcoat"
desc = "A standard-issue CDC labcoat that protects against minor chemical spills. It has the name \"Wiles\" sewn on to the breast pocket."
+1 -1
View File
@@ -31,7 +31,7 @@ mob/proc/custom_emote(var/m_type=1,var/message = null)
if (istype(M, /mob/new_player))
continue
if(findtext(message," snores.")) //Because we have so many sleeping people.
continue
break
if(M.stat == 2 && M.client.ghost_sight && !(M in viewers(src,null)))
M.show_message(message)
@@ -418,8 +418,8 @@
if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]"
//NOTE: the alerts dont reset when youre out of danger. dont blame me,
//blame the person who coded them. Temporary fix added.
client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
if (client)
client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
if ((blind && stat != 2))
if ((blinded))
@@ -441,7 +441,7 @@
if (!( machine.check_eye(src) ))
reset_view(null)
else
if(!client.adminobs)
if(client && !client.adminobs)
reset_view(null)
return 1
@@ -332,9 +332,8 @@ FUCK YOU MORE FAT CODE -Hawk*/
if (fire) fire.icon_state = "fire[fire_alert ? 1 : 0]"
//NOTE: the alerts dont reset when youre out of danger. dont blame me,
//blame the person who coded them. Temporary fix added.
client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
if (client)
client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
if ((blind && stat != 2))
if ((blinded))
@@ -356,7 +355,7 @@ FUCK YOU MORE FAT CODE -Hawk*/
if (!( machine.check_eye(src) ))
reset_view(null)
else
if(!client.adminobs)
if(client && !client.adminobs)
reset_view(null)
return 1
+3 -3
View File
@@ -242,8 +242,8 @@
healths.icon_state = "health7"
if(pullin) pullin.icon_state = "pull[pulling ? 1 : 0]"
client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
if (client)
client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
if ((blind && stat != 2))
if ((blinded))
@@ -265,7 +265,7 @@
if (!( machine.check_eye(src) ))
reset_view(null)
else
if(!client.adminobs)
if(client && !client.adminobs)
reset_view(null)
return 1
+1 -1
View File
@@ -141,7 +141,7 @@
shock_damage *= siemens_coeff
if (shock_damage<1)
return 0
src.take_overall_damage(0,shock_damage)
src.take_overall_damage(0,shock_damage,used_weapon="Electrocution")
//src.burn_skin(shock_damage)
//src.adjustFireLoss(shock_damage) //burn_skin will do this for us
//src.updatehealth()
@@ -2,7 +2,7 @@
gender = MALE
var/list/stomach_contents = list()
var/brain_op_stage = 0.0
var/embryo_op_stage = 0
var/ribcage_op_stage = 0
/*
var/eye_op_stage = 0.0
var/appendix_op_stage = 0.0
@@ -19,4 +19,4 @@
var/analgesic = 0 // when this is set, the mob isn't affected by shock or pain
// life should decrease this by 1 every tick
// total amount of wounds on mob, used to spread out healing and the like over all wounds
var/number_wounds = 0
var/number_wounds = 0
@@ -482,9 +482,9 @@
if (m_type & 1)
for (var/mob/O in viewers(src, null))
for (var/mob/O in get_mobs_in_view(world.view,src))
O.show_message(message, m_type)
else if (m_type & 2)
for (var/mob/O in hearers(src.loc, null))
for (var/mob/O in (hearers(src.loc, null) | get_mobs_in_view(world.view,src)))
O.show_message(message, m_type)
+55 -18
View File
@@ -272,34 +272,36 @@
// focus most of the blast on one organ
var/datum/organ/external/take_blast = pick(organs)
update |= take_blast.take_damage(b_loss * 0.9, f_loss * 0.9)
update |= take_blast.take_damage(b_loss * 0.9, f_loss * 0.9, used_weapon = "Explosive blast")
// distribute the remaining 10% on all limbs equally
b_loss *= 0.1
f_loss *= 0.1
var/weapon_message = "Explosive Blast"
for(var/datum/organ/external/temp in organs)
switch(temp.name)
if("head")
update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2)
update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message)
if("chest")
update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4)
update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message)
if("l_arm")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05)
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_arm")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05)
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("l_leg")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05)
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_leg")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05)
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_foot")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05)
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("l_foot")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05)
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_arm")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05)
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("l_arm")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05)
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if(update) UpdateDamageIcon()
@@ -819,6 +821,12 @@
/mob/living/carbon/human/proc/morph()
set name = "Morph"
set category = "Superpower"
if(stat!=CONSCIOUS)
reset_view(0)
remoteview_target = null
return
if(!(mMorph in mutations))
src.verbs -= /mob/living/carbon/human/proc/morph
return
@@ -892,6 +900,12 @@
/mob/living/carbon/human/proc/remotesay()
set name = "Project mind"
set category = "Superpower"
if(stat!=CONSCIOUS)
reset_view(0)
remoteview_target = null
return
if(!(mRemotetalk in src.mutations))
src.verbs -= /mob/living/carbon/human/proc/remotesay
return
@@ -915,12 +929,19 @@
set name = "Remote View"
set category = "Superpower"
if(stat!=CONSCIOUS)
remoteview_target = null
reset_view(0)
return
if(!(mRemote in src.mutations))
remoteview_target = null
reset_view(0)
src.verbs -= /mob/living/carbon/human/proc/remoteobserve
return
if(client.eye != client.mob)
remoteview_target = null
reset_view(0)
return
@@ -928,15 +949,17 @@
for(var/mob/living/carbon/h in world)
var/turf/temp_turf = get_turf(h)
if(temp_turf.z != 1 && temp_turf.z != 5) //Not on mining or the station.
if((temp_turf.z != 1 && temp_turf.z != 5) || h.stat!=CONSCIOUS) //Not on mining or the station. Or dead
continue
creatures += h
var/mob/target = input ("Who do you want to project your mind to ?") as mob in creatures
if (target)
remoteview_target = target
reset_view(target)
else
remoteview_target = null
reset_view(0)
/mob/living/carbon/human/proc/get_visible_gender()
@@ -945,11 +968,11 @@
return gender
/mob/living/carbon/human/proc/increase_germ_level(n)
if(gloves)
gloves.germ_level += n
else
germ_level += n
if(gloves)
gloves.germ_level += n
else
germ_level += n
/mob/living/carbon/human/revive()
for (var/datum/organ/external/O in organs)
O.status &= ~ORGAN_BROKEN
@@ -970,4 +993,18 @@
del(H)
..()
..()
/mob/living/carbon/human/proc/is_lung_ruptured()
var/datum/organ/external/chest/E = get_organ("chest")
return E.ruptured_lungs
/mob/living/carbon/human/proc/rupture_lung()
var/datum/organ/external/chest/E = get_organ("chest")
if(E.ruptured_lungs == 0)
src.custom_pain("You feel a stabbing pain in your chest!", 1)
E.ruptured_lungs = 1
@@ -61,6 +61,7 @@
switch(M.a_intent)
if("help")
if(health > config.health_threshold_crit)
diary << "\[[time2text(world.timeofday, "hh:mm.ss")]\] CPR BUGHINTING: [M] shakes [src]: health - [health], threshold - [config.health_threshold_crit]. Health details: OX [getOxyLoss()] TX [getToxLoss()] BU [getFireLoss()] BR [getBruteLoss()] Blood: [round(vessel.get_reagent_amount("blood"))] out of 560"
help_shake_act(M)
return 1
// if(M.health < -75) return 0
@@ -116,7 +116,7 @@
if(update) UpdateDamageIcon()
// damage MANY external organs, in random order
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0)
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/used_weapon = null)
if(nodamage) return //godmode
var/list/datum/organ/external/parts = get_damageable_organs()
var/update = 0
@@ -126,7 +126,7 @@
var/brute_was = picked.brute_dam
var/burn_was = picked.burn_dam
update |= picked.take_damage(brute,burn,sharp)
update |= picked.take_damage(brute,burn,sharp,used_weapon)
brute -= (picked.brute_dam - brute_was)
burn -= (picked.burn_dam - burn_was)
@@ -154,7 +154,7 @@
zone = "head"
return organs_by_name[zone]
/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0)
/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/used_weapon = null)
if((damagetype != BRUTE) && (damagetype != BURN))
..(damage, damagetype, def_zone, blocked)
return 1
@@ -176,10 +176,10 @@
switch(damagetype)
if(BRUTE)
if(organ.take_damage(damage, 0, sharp))
if(organ.take_damage(damage, 0, sharp, used_weapon))
UpdateDamageIcon()
if(BURN)
if(organ.take_damage(0, damage, sharp))
if(organ.take_damage(0, damage, sharp, used_weapon))
UpdateDamageIcon()
updatehealth()
return 1
@@ -133,7 +133,7 @@ emp_act
if(armor >= 2) return 0
if(!I.force) return 0
apply_damage(I.force, I.damtype, affecting, armor , I.sharp)
apply_damage(I.force, I.damtype, affecting, armor , I.sharp, I.name)
var/bloody = 0
if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (I.force * 2)))
@@ -55,4 +55,6 @@
var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
var/xylophone = 0 //For the spoooooooky xylophone cooldown
var/xylophone = 0 //For the spoooooooky xylophone cooldown
var/mob/remoteview_target = null
@@ -433,8 +433,9 @@
return
message = "\red <B>[source] is trying to empty [target]'s pockets.</B>"
if("CPR")
if (target.cpr_time >= world.time + 3)
if (!target.cpr_time)
del(src)
target.cpr_time = 0
message = "\red <B>[source] is trying perform CPR on [target]!</B>"
if("id")
message = "\red <B>[source] is trying to take off [target.wear_id] from [target]'s uniform!</B>"
@@ -460,6 +461,7 @@ The else statement is for equipping stuff to empty slots.
It can still be worn/put on as normal.
*/
/obj/effect/equip_e/human/done() //TODO: And rewrite this :< ~Carn
target.cpr_time = 1
if(!source || !target) return //Target or source no longer exist
if(source.loc != s_loc) return //source has moved
if(target.loc != t_loc) return //target has moved
@@ -540,10 +542,7 @@ It can still be worn/put on as normal.
if (target.legcuffed)
strip_item = target.legcuffed
if("CPR")
if (target.cpr_time >= world.time + 30)
del(src)
if ((target.health >= -99.0 && target.health <= 0))
target.cpr_time = world.time
var/suff = min(target.getOxyLoss(), 7)
target.adjustOxyLoss(-suff)
target.updatehealth()
+65 -16
View File
@@ -1,8 +1,8 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
//NOTE: Breathing happens once per FOUR TICKS, unless the last breath fails. In which case it happens once per ONE TICK! So oxyloss healing is done once per 4 ticks while oxyloss damage is applied once per tick!
#define HUMAN_MAX_OXYLOSS 3 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it.
#define HUMAN_CRIT_MAX_OXYLOSS ( (last_tick_duration) /3) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 100HP to get through, so (1/3)*last_tick_duration per second. Breaths however only happen every 4 ticks.
#define HUMAN_MAX_OXYLOSS 1 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it.
#define HUMAN_CRIT_MAX_OXYLOSS ( (last_tick_duration) /5) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 100HP to get through, so (1/3)*last_tick_duration per second. Breaths however only happen every 4 ticks.
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
#define HEAT_DAMAGE_LEVEL_2 4 //Amount of damage applied when your body temperature passes the 400K point
@@ -130,7 +130,7 @@
proc/handle_blood()
// take care of blood and blood loss
if(stat < 2)
if(stat < 2 && bodytemperature >= 170)
var/blood_volume = round(vessel.get_reagent_amount("blood"))
if(blood_volume < 560 && blood_volume)
var/datum/reagent/blood/B = locate() in vessel.reagent_list //Grab some blood
@@ -187,6 +187,10 @@
var/word = pick("dizzy","woosey","faint")
src << "\red You feel extremely [word]"
if(0 to 122)
// There currently is a strange bug here. If the mob is not below -100 health
// when death() is called, apparently they will be just fine, and this way it'll
// spam deathgasp. Adjusting toxloss ensures the mob will stay dead.
toxloss += 300 // just to be safe!
death()
@@ -459,15 +463,18 @@
radiation = 0
else
var/damage = 0
switch(radiation)
if(1 to 49)
radiation--
if(prob(25))
adjustToxLoss(1)
damage = 1
updatehealth()
if(50 to 74)
radiation -= 2
damage = 1
adjustToxLoss(1)
if(prob(5))
radiation -= 5
@@ -479,6 +486,7 @@
if(75 to 100)
radiation -= 3
adjustToxLoss(3)
damage = 1
if(prob(1))
src << "\red You mutate!"
randmutb(src)
@@ -486,18 +494,28 @@
emote("gasp")
updatehealth()
if(damage && organs.len)
var/datum/organ/external/O = pick(organs)
if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage)
proc/breathe()
if(reagents.has_reagent("lexorin")) return
if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return
var/lung_ruptured = is_lung_ruptured()
if(lung_ruptured && prob(2))
spawn emote("me", 1, "coughs up blood!")
src.drip(10)
var/datum/gas_mixture/environment = loc.return_air()
var/datum/gas_mixture/breath
// HACK NEED CHANGING LATER
if(health < 0)
losebreath++
if(lung_ruptured && prob(4))
spawn emote("me", 1, "gasps for air!")
losebreath += 5
if(losebreath>0) //Suffocating so do not take a breath
losebreath--
if (prob(10)) //Gasp per 10 ticks? Sounds about right.
@@ -514,7 +532,7 @@
if(!breath)
if(isobj(loc))
var/obj/location_as_object = loc
breath = location_as_object.handle_internal_lifeform(src, BREATH_VOLUME)
breath = location_as_object.handle_internal_lifeform(src, BREATH_MOLES)
else if(isturf(loc))
var/breath_moles = 0
/*if(environment.return_pressure() > ONE_ATMOSPHERE)
@@ -525,6 +543,13 @@
breath_moles = environment.total_moles()*BREATH_PERCENTAGE
breath = loc.remove_air(breath_moles)
if(!lung_ruptured)
if(!breath || breath.total_moles < BREATH_MOLES / 5 || breath.total_moles > BREATH_MOLES * 5)
if(prob(5))
rupture_lung()
// Handle chem smoke effect -- Doohl
var/block = 0
if(wear_mask)
@@ -682,22 +707,22 @@
switch(breath.temperature)
if(-INFINITY to 120)
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head")
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
if(120 to 200)
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head")
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
if(200 to 260)
apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head")
apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
if(360 to 400)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head")
apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
if(400 to 1000)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head")
apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
if(1000 to INFINITY)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head")
apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
//Temporary fixes to the alerts.
@@ -988,7 +1013,8 @@
proc/handle_chemicals_in_body()
if(reagents) reagents.metabolize(src)
if(dna && dna.mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist
// if(dna && dna.mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist
if(PLANT in mutations)
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(loc)) //else, there's considered to be no light
var/turf/T = loc
@@ -1034,7 +1060,8 @@
if(overeatduration > 1)
overeatduration -= 2 //doubled the unfat rate
if(dna && dna.mutantrace == "plant")
// if(dna && dna.mutantrace == "plant")
if(PLANT in mutations)
if(nutrition < 200)
take_overall_damage(2,0)
@@ -1054,6 +1081,19 @@
dizziness = max(0, dizziness - 3)
jitteriness = max(0, jitteriness - 3)
if(life_tick % 10 == 0)
// handle trace chemicals for autopsy
for(var/datum/organ/O in organs)
for(var/chemID in O.trace_chemicals)
O.trace_chemicals[chemID] = O.trace_chemicals[chemID] - 1
if(O.trace_chemicals[chemID] <= 0)
O.trace_chemicals.Remove(chemID)
for(var/datum/reagent/A in reagents.reagent_list)
// add chemistry traces to a random organ
var/datum/organ/O = pick(organs)
O.trace_chemicals[A.name] = 100
updatehealth()
return //TODO: DEFERRED
@@ -1266,9 +1306,13 @@
sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
if(dna)
switch(dna.mutantrace)
if("lizard","metroid")
if("metroid")
see_in_dark = 3
see_invisible = SEE_INVISIBLE_LEVEL_ONE
if("lizard")
see_in_dark = 3
if("tajaran")
see_in_dark = 8
else
see_in_dark = 2
@@ -1441,7 +1485,12 @@
if(machine)
if(!machine.check_eye(src)) reset_view(null)
else
if(!(mRemote in mutations) && !client.adminobs)
var/isRemoteObserve = 0
if((mRemote in mutations) && remoteview_target)
if(remoteview_target.stat==CONSCIOUS)
isRemoteObserve = 1
if(!isRemoteObserve && client && !client.adminobs)
remoteview_target = null
reset_view(null)
return 1
@@ -218,107 +218,133 @@ proc/get_damage_icon_part(damage_state, body_part)
/mob/living/carbon/human/proc/update_body(var/update_icons=1)
if(stand_icon) del(stand_icon)
if(lying_icon) del(lying_icon)
if(dna && dna.mutantrace) return
var/husk_color_mod = rgb(96,88,80)
var/hulk_color_mod = rgb(48,224,40)
var/plant_color_mod = rgb(144,224,144)
var/husk = (HUSK in src.mutations) //100% unnecessary -Agouri //nope, do you really want to iterate through src.mutations repeatedly? -Pete
var/fat = (FAT in src.mutations)
var/hulk = (HULK in src.mutations)
var/skeleton = (SKELETON in src.mutations)
var/plant = (PLANT in src.mutations)
var/g = "m"
if(gender == FEMALE) g = "f"
// whether to draw the individual limbs
var/individual_limbs = 0
//Base mob icon
if(husk)
stand_icon = new /icon('icons/mob/human.dmi', "husk_s")
lying_icon = new /icon('icons/mob/human.dmi', "husk_l")
else if(fat)
stand_icon = new /icon('icons/mob/human.dmi', "fatbody_s")
lying_icon = new /icon('icons/mob/human.dmi', "fatbody_l")
else if(skeleton)
stand_icon = new /icon('icons/mob/human.dmi', "skeleton_s")
lying_icon = new /icon('icons/mob/human.dmi', "skeleton_l")
var/icon/icobase
if(skeleton)
icobase = 'icons/mob/human_races/r_skeleton.dmi'
else if(dna)
switch(dna.mutantrace)
if("tajaran")
icobase = 'icons/mob/human_races/r_tajaran.dmi'
if("lizard")
icobase = 'icons/mob/human_races/r_lizard.dmi'
if("skrell")
icobase = 'icons/mob/human_races/r_skrell.dmi'
else
icobase = 'icons/mob/human_races/r_human.dmi'
else
stand_icon = new /icon('icons/mob/human.dmi', "torso_[g]_s")
lying_icon = new /icon('icons/mob/human.dmi', "torso_[g]_l")
individual_limbs = 1
icobase = 'icons/mob/human_races/r_human.dmi'
// Draw each individual limb
if(individual_limbs)
stand_icon.Blend(new /icon('icons/mob/human.dmi', "chest_[g]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('icons/mob/human.dmi', "chest_[g]_l"), ICON_OVERLAY)
if(!skeleton)
stand_icon = new /icon(icobase, "torso_[g][fat?"_fat":""]")
if(husk)
stand_icon.ColorTone(husk_color_mod)
else if(hulk)
// stand_icon.ColorTone(hulk_color_mod)
var/list/TONE = ReadRGB(hulk_color_mod)
stand_icon.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3]))
else if(plant)
stand_icon.ColorTone(plant_color_mod)
else
stand_icon = new /icon(icobase, "torso")
var/datum/organ/external/head = get_organ("head")
if(head && !(head.status & ORGAN_DESTROYED))
stand_icon.Blend(new /icon('icons/mob/human.dmi', "head_[g]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('icons/mob/human.dmi', "head_[g]_l"), ICON_OVERLAY)
var/datum/organ/external/head = get_organ("head")
var/has_head = 0
if(head && !(head.status & ORGAN_DESTROYED))
has_head = 1
for(var/datum/organ/external/part in organs)
if(!istype(part, /datum/organ/external/groin) \
&& !istype(part, /datum/organ/external/chest) \
&& !istype(part, /datum/organ/external/head) \
&& !(part.status & ORGAN_DESTROYED))
var/icon/temp = new /icon('human.dmi', "[part.icon_name]_s")
if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
for(var/datum/organ/external/part in organs)
if(!istype(part, /datum/organ/external/chest) && !(part.status & ORGAN_DESTROYED))
var/icon/temp
if(istype(part, /datum/organ/external/groin))
if(skeleton)
temp = new /icon(icobase, "groin")
else
temp = new /icon(icobase, "groin_[g]")
else if(istype(part, /datum/organ/external/head))
if(skeleton)
temp = new /icon(icobase, "head")
else
temp = new /icon(icobase, "head_[g]")
else
temp = new /icon(icobase, "[part.icon_name]")
if(part.status & ORGAN_ROBOT)
temp.GrayScale()
else if(!skeleton)
if(husk)
temp.ColorTone(husk_color_mod)
else if(hulk)
// temp.ColorTone(hulk_color_mod)
var/list/TONE = ReadRGB(hulk_color_mod)
temp.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3]))
else if(plant)
temp.ColorTone(plant_color_mod)
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
//And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
if(part.icon_position&(LEFT|RIGHT))
var/icon/temp2 = new('icons/mob/human.dmi',"blank")
temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH)
temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH)
if(!(part.icon_position & LEFT))
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
if(!(part.icon_position & RIGHT))
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
stand_icon.Blend(temp2, ICON_OVERLAY)
temp2 = new('icons/mob/human.dmi',"blank")
if(part.icon_position & LEFT)
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
if(part.icon_position & RIGHT)
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
stand_icon.Blend(temp2, ICON_UNDERLAY)
else
stand_icon.Blend(temp, ICON_OVERLAY)
temp = new /icon('human.dmi', "[part.icon_name]_l")
if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
lying_icon.Blend(temp , ICON_OVERLAY)
stand_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('human.dmi', "groin_[g]_l"), ICON_OVERLAY)
if (husk)
var/icon/husk_s = new /icon('human.dmi', "husk_s")
var/icon/husk_l = new /icon('human.dmi', "husk_l")
for(var/datum/organ/external/part in organs)
if(!istype(part, /datum/organ/external/groin) \
&& !istype(part, /datum/organ/external/chest) \
&& !istype(part, /datum/organ/external/head) \
&& (part.status & ORGAN_DESTROYED))
husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT)
husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT)
stand_icon.Blend(husk_s, ICON_OVERLAY)
lying_icon.Blend(husk_l, ICON_OVERLAY)
//Skin tone
if(!skeleton)
if(!skeleton && !husk && !hulk && !plant)
if(s_tone >= 0)
stand_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
lying_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
else
stand_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
lying_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
//Eyes
if(!skeleton)
var/icon/eyes_s = new/icon('icons/mob/human_face.dmi', "eyes_s")
var/icon/eyes_l = new/icon('icons/mob/human_face.dmi', "eyes_l")
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
eyes_l.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
stand_icon.Blend(eyes_s, ICON_OVERLAY)
lying_icon.Blend(eyes_l, ICON_OVERLAY)
// Note: These used to be in update_face(), and the fact they're here will make it difficult to create a disembodied head
var/icon/eyes_s = new/icon('icons/mob/human_face.dmi', "eyes_s")
var/icon/eyes_l = new/icon('icons/mob/human_face.dmi', "eyes_l")
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
eyes_l.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
stand_icon.Blend(eyes_s, ICON_OVERLAY)
lying_icon.Blend(eyes_l, ICON_OVERLAY)
if(husk)
var/icon/mask = new(stand_icon)
var/icon/husk_over = new(icobase,"overlay_husk")
mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0)
husk_over.Blend(mask, ICON_ADD)
stand_icon.Blend(husk_over, ICON_OVERLAY)
if(has_head)
//Eyes
if(!skeleton)
var/icon/eyes_s = new/icon('icons/mob/human_face.dmi', "eyes_s")
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
stand_icon.Blend(eyes_s, ICON_OVERLAY)
//Mouth (lipstick!)
if(lip_style) //skeletons are allowed to wear lipstick no matter what you think, agouri.
stand_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_s"), ICON_OVERLAY)
lying_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_l"), ICON_OVERLAY)
//Underwear
if(underwear >0 && underwear < 12)
if(!fat && !skeleton)
stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
lying_icon = stand_icon.MakeLying()
if(update_icons)
update_icons()
@@ -417,27 +443,29 @@ proc/get_damage_icon_part(damage_state, body_part)
var/fat
if( FAT in mutations )
fat = "fat"
var/g = "m"
if (gender == FEMALE) g = "f"
// var/g = "m"
// if (gender == FEMALE) g = "f"
//BS12 EDIT
if(dna)
switch(dna.mutantrace)
if("golem","metroid")
overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_l")
overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_s")
if("lizard", "tajaran", "skrell")
overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_l")
overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_s")
if("plant")
if(stat == DEAD) //TODO
overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace]_d")
else
overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_l")
overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_s")
var/icon/I = new('icons/effects/genetics.dmi',"[dna.mutantrace][fat]_s")
overlays_standing[MUTANTRACE_LAYER] = image(I)
overlays_lying[MUTANTRACE_LAYER] = image(I.MakeLying())
// if("lizard", "tajaran", "skrell")
// overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_l")
// overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[g]_s")
// if("plant")
// if(stat == DEAD) //TODO
// overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace]_d")
// else
// overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_l")
// overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_s")
else
overlays_lying[MUTANTRACE_LAYER] = null
overlays_standing[MUTANTRACE_LAYER] = null
update_body(0)
if(!dna || !(dna.mutantrace in list("golem","metroid")))
update_body(0)
update_hair(0)
if(update_icons) update_icons()
@@ -551,7 +551,7 @@
if (!( machine.check_eye(src) ))
reset_view(null)
else
if(!client.adminobs)
if(client && !client.adminobs)
reset_view(null)
return 1
@@ -25,7 +25,7 @@
dna = new /datum/dna( null )
dna.real_name = real_name
dna.uni_identity = "00600200A00E0110148FC01300B009"
dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
dna.unique_enzymes = md5(name)
//////////blah
var/gendervar
+2 -2
View File
@@ -57,6 +57,6 @@
P.on_hit(src,2)
return 2
if(!P.nodamage)
apply_damage((P.damage/(absorb+1)), P.damage_type, def_zone)
apply_damage((P.damage/(absorb+1)), P.damage_type, def_zone, used_weapon = "Projectile([P.name])")
P.on_hit(src, absorb)
return absorb
return absorb
+5 -4
View File
@@ -1,6 +1,7 @@
/mob/living/Logout()
..()
if(!key && mind) //key and mind have become seperated.
mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body.
if(!immune_to_ssd && sleeping < 2 && mind.active)
sleeping = 2
if (mind)
if(!key) //key and mind have become seperated.
mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body.
if(!immune_to_ssd && sleeping < 2 && mind.active)
sleeping = 2
+23 -1
View File
@@ -117,7 +117,7 @@
return
//if(icon_state == initial(icon_state))
var/icontype = ""
var/icontype = ""
var/list/icons = list("Monochrome", "Blue", "Inverted", "Firewall", "Green", "Red", "Static")
if (src.name == "B.A.N.N.E.D." && src.ckey == "spaceman96")
icons += "B.A.N.N.E.D."
@@ -708,3 +708,25 @@
src.current = camera
src.current.SetLuminosity(AI_CAMERA_LUMINOSITY)
camera_light_on = world.timeofday + 1 * 20 // Update the light every 2 seconds.
/mob/living/silicon/ai/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench))
if(anchored)
user.visible_message("\blue \The [user] starts to unbolt \the [src] from the plating...")
if(!do_after(user,40))
user.visible_message("\blue \The [user] decides not to unbolt \the [src].")
return
user.visible_message("\blue \The [user] finishes unfastening \the [src]!")
anchored = 0
return
else
user.visible_message("\blue \The [user] starts to bolt \the [src] to the plating...")
if(!do_after(user,40))
user.visible_message("\blue \The [user] decides not to bolt \the [src].")
return
user.visible_message("\blue \The [user] finishes fastening down \the [src]!")
anchored = 1
return
else
return ..()
+1 -1
View File
@@ -90,7 +90,7 @@
src.see_in_dark = 0
src.see_invisible = SEE_INVISIBLE_LIVING
if (((!loc.master.power_equip) || istype(T, /turf/space)) && !istype(src.loc,/obj/item))
if (((!loc.master.power_equip) || istype(T, /turf/space)) && !istype(src.loc,/obj/item) && !istype(get_area(src), /area/shuttle))
if (src:aiRestorePowerRoutine==0)
src:aiRestorePowerRoutine = 1
@@ -195,10 +195,13 @@
m_type = 2
if("law")
message = "<B>[src]</B> shows its legal authorization barcode."
if (istype(module,/obj/item/weapon/robot_module/security))
message = "<B>[src]</B> shows its legal authorization barcode."
playsound(src.loc, 'biamthelaw.ogg', 50, 0)
m_type = 2
playsound(src.loc, 'biamthelaw.ogg', 50, 0)
m_type = 2
else
src << "You are not THE LAW, pal."
else
src << text("Invalid Emote: []", act)
if ((message && src.stat == 0))
@@ -140,16 +140,16 @@
src.sight |= SEE_MOBS
src.sight |= SEE_OBJS
src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
src.see_invisible = SEE_INVISIBLE_MINIMUM
else if (src.sight_mode & BORGMESON && src.sight_mode & BORGTHERM)
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
src.see_invisible = SEE_INVISIBLE_MINIMUM
else if (src.sight_mode & BORGMESON)
src.sight |= SEE_TURFS
src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
src.see_invisible = SEE_INVISIBLE_MINIMUM
else if (src.sight_mode & BORGTHERM)
src.sight |= SEE_MOBS
src.see_in_dark = 8
@@ -255,7 +255,7 @@
if (!( src.machine.check_eye(src) ))
src.reset_view(null)
else
if(!client.adminobs)
if(client && !client.adminobs)
reset_view(null)
return 1
+1 -1
View File
@@ -912,4 +912,4 @@ note dizziness decrements automatically in the mob's Life() proc.
return ""
/mob/proc/flash_weak_pain()
flick("weak_pain",pain)
flick("weak_pain",pain)
+7 -1
View File
@@ -112,6 +112,12 @@
killing = 0
hud1.icon_state = "disarm/kill"
return
if(ishuman(affecting))
var/mob/living/carbon/human/H = affecting
var/datum/organ/external/head = H.get_organ("head")
head.add_autopsy_data("Strangulation", 0)
affecting.Weaken(5) // Should keep you down unless you get help.
affecting.Stun(5) // It will hamper your voice, being choked and all.
affecting.losebreath = min(affecting.losebreath + 2, 3)
@@ -293,4 +299,4 @@
/obj/item/weapon/grab/Del()
del(hud1)
..()
return
return
+6 -1
View File
@@ -282,6 +282,7 @@
return 0
move_delay = world.time//set move delay
switch(mob.m_intent)
if("run")
if(mob.drowsyness > 0)
@@ -294,6 +295,10 @@
if(config.Tickcomp)
move_delay -= 1.3
var/tickcomp = ((1/(world.tick_lag))*1.3)
move_delay = move_delay + tickcomp
//We are now going to move
moving = 1
@@ -500,4 +505,4 @@
prob_slip = 0 // Changing this to zero to make it line up with the comment.
prob_slip = round(prob_slip)
return(prob_slip)
return(prob_slip)
+1 -53
View File
@@ -147,24 +147,7 @@
return 1
if(href_list["ready"])
var/num_old_slots = GetAvailableAlienPlayerSlots()
var/new_slots = num_old_slots
if(!ready)
if(num_old_slots >= 1 || preferences.species == "Human")
ready = 1
new_slots = GetAvailableAlienPlayerSlots()
else
src << "\red Unable to declare ready. Too many players have already elected to play as aliens."
else
ready = 0
new_slots = GetAvailableAlienPlayerSlots()
if(num_old_slots < 1 && new_slots >= 1)
for(var/mob/new_player/N in world)
N << "\blue A new alien player slot has opened."
else if(num_old_slots >= 1 && new_slots < 1)
for(var/mob/new_player/N in world)
N << "\red New alien players can no longer enter the game."
ready = !ready
if(href_list["refresh"])
src << browse(null, "window=playersetup") //closes the player setup window
@@ -205,9 +188,6 @@
if(!is_alien_whitelisted(src, preferences.species) && config.usealienwhitelist)
src << alert("You are currently not whitelisted to play [preferences.species].")
return 0
else if(GetAvailableAlienPlayerSlots() < 1)
src << "\red Unable to join game. Too many players have already joined as aliens."
return 0
LateChoices()
@@ -356,15 +336,10 @@
src << alert("[rank] is not available. Please try another.")
return 0
var/num_old_slots = GetAvailableAlienPlayerSlots()
var/new_slots = num_old_slots
if(preferences.species != "Human")
if(!is_alien_whitelisted(src, preferences.species) && config.usealienwhitelist)
src << alert("You are currently not whitelisted to play [preferences.species].")
return 0
else if(num_old_slots < 1)
src << "\red Unable to join game. Too many players have already joined as aliens."
return 0
job_master.AssignRole(src, rank, 1)
@@ -384,14 +359,6 @@
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
AnnounceArrival(character, rank)
new_slots = GetAvailableAlienPlayerSlots()
if(num_old_slots < 1 && new_slots >= 1)
for(var/mob/new_player/N in world)
N << "\blue A new alien player slot has opened."
else if(num_old_slots >= 1 && new_slots < 1)
for(var/mob/new_player/N in world)
N << "\red New alien players can no longer enter the game."
else
character.Robotize()
del(src)
@@ -492,22 +459,3 @@
proc/close_spawn_windows()
src << browse(null, "window=latechoices") //closes late choices window
src << browse(null, "window=playersetup") //closes the player setup window
//limits the number of alien players in a game
/proc/GetAvailableAlienPlayerSlots()
if(!config.limitalienplayers)
return 9999
var/num_players = 0
//check new players
for(var/mob/new_player/N in world)
if(N.preferences && N.ready)
num_players++
//check players already spawned, only count humans or aliens
for(var/mob/living/carbon/human/H in world)
if(H.ckey)
num_players++
return round(num_players * (config.alien_to_human_ratio / 100))
+1 -1
View File
@@ -226,7 +226,7 @@
/obj/item/weapon/paper/Topic(href, href_list)
..()
if((usr.stat || usr.restrained()))
if(!usr || (usr.stat || usr.restrained()))
return
if(href_list["write"])
+1 -1
View File
@@ -527,7 +527,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
/obj/item/weapon/cable_coil/attack(mob/M as mob, mob/user as mob)
if(hasorgans(M))
var/datum/organ/external/S = M:organs[user.zone_sel.selecting]
var/datum/organ/external/S = M:get_organ(user.zone_sel.selecting)
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help")
return ..()
if(S.burn_dam > 0)
+2
View File
@@ -119,6 +119,8 @@
if(!unmarked || !C.powernet)
if(C.d1 == fdir || C.d2 == fdir)
. += C
else if(C.d1 == turn(C.d2, 180))
. += C
return .
+1 -1
View File
@@ -61,7 +61,7 @@
/obj/machinery/power/smes/proc/chargedisplay()
return round(5.5*charge/capacity)
return round(5.5*charge/(capacity ? capacity : 5e6))
#define SMESRATE 0.05 // rate of internal charge to external power
@@ -90,7 +90,7 @@ obj/item/weapon/gun/energy/laser/retro
name = "laser tag gun"
icon_state = "bluetag"
desc = "Standard issue weapon of the Imperial Guard"
projectile_type = "/obj/item/projectile/beam/bluetag"
projectile_type = "/obj/item/projectile/beam/lastertag/blue"
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
var/charge_tick = 0
@@ -127,7 +127,7 @@ obj/item/weapon/gun/energy/laser/retro
name = "laser tag gun"
icon_state = "redtag"
desc = "Standard issue weapon of the Imperial Guard"
projectile_type = "/obj/item/projectile/beam/redtag"
projectile_type = "/obj/item/projectile/beam/lastertag/red"
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
var/charge_tick = 0
+3 -3
View File
@@ -111,7 +111,7 @@ var/list/beam_master = list()
/obj/item/projectile/beam/bluetag
/obj/item/projectile/beam/lastertag/blue
name = "lasertag beam"
icon_state = "bluelaser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
@@ -126,7 +126,7 @@ var/list/beam_master = list()
M.Weaken(5)
return 1
/obj/item/projectile/beam/redtag
/obj/item/projectile/beam/lastertag/red
name = "lasertag beam"
icon_state = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
@@ -141,7 +141,7 @@ var/list/beam_master = list()
M.Weaken(5)
return 1
/obj/item/projectile/beam/omnitag//A laser tag bolt that stuns EVERYONE
/obj/item/projectile/beam/lastertag/omni//A laser tag bolt that stuns EVERYONE
name = "lasertag beam"
icon_state = "omnilaser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
@@ -79,7 +79,8 @@
on_hit(var/atom/target, var/blocked = 0)
var/mob/living/M = target
if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //Plantmen possibly get mutated and damaged by the rays.
// if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //Plantmen possibly get mutated and damaged by the rays.
if(ishuman(target) && (PLANT in M.mutations)) //Plantmen possibly get mutated and damaged by the rays.
if(prob(15))
M.apply_effect((rand(30,80)),IRRADIATE)
M.Weaken(5)
@@ -116,7 +117,8 @@
on_hit(var/atom/target, var/blocked = 0)
var/mob/M = target
if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //These rays make plantmen fat.
// if(ishuman(target) && M.dna && M.dna.mutantrace == "plant") //These rays make plantmen fat.
if(ishuman(target) && (PLANT in M.mutations)) //These rays make plantmen fat.
if(M.nutrition < 500) //sanity check
M.nutrition += 30
else if (istype(target, /mob/living/carbon/))
+2 -1
View File
@@ -1146,7 +1146,8 @@ datum
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.dna)
if(H.dna.mutantrace == "plant") //plantmen take a LOT of damage
// if(H.dna.mutantrace == "plant") //plantmen take a LOT of damage
if(PLANT in H.mutations) //plantmen take a LOT of damage
H.adjustToxLoss(10)
plasma
@@ -55,7 +55,7 @@
/obj/item/weapon/reagent_containers/hypospray/autoinjector
name = "autoinjector"
desc = "A rapid and safe way to administer small amounts of drugs by untrained or trained personnel."
icon_state = "autoinjector1"
icon_state = "autoinjector"
item_state = "autoinjector"
amount_per_transfer_from_this = 5
volume = 5
+2 -1
View File
@@ -145,7 +145,8 @@
bullet_act(var/obj/item/projectile/Proj)
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
explode()
if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) )
explode()
blob_act()
explode()
+3
View File
@@ -155,6 +155,9 @@
else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis)
msg = "[user.name] stuffs [target.name] into the [src]!"
user << "You stuff [target.name] into the [src]!"
log_attack("<font color='red'>[user] ([user.ckey]) placed [target] ([target.ckey]) in a disposals unit.</font>")
log_admin("ATTACK: [usr] ([user.ckey]) placed [target] ([target.ckey]) in a disposals unit.")
msg_admin_attack("ATTACK: [user] ([user.ckey]) placed [target] ([target.ckey]) in a disposals unit.")
else
return
if (target.client)
+10 -1
View File
@@ -102,13 +102,22 @@
user.attack_log += text("\[[time_stamp()]\] <font color='blue'>Has used [src.name] on \ref[target]</font>")
if (istype(target, /obj/item) && !(istype(target, /obj/item/weapon/storage)))
if (istype(target, /obj/item))
var/obj/item/O = target
if (src.amount > 1)
var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(O.loc)) //Aaannd wrap it up!
if(!istype(O.loc, /turf))
if(user.client)
user.client.screen -= O
P.w_class = O.w_class
if(P.w_class <= 1.0)
P.icon_state = "deliverycrate1"
else if (P.w_class <= 2.0)
P.icon_state = "deliverycrate2"
else if (P.w_class <= 3.0)
P.icon_state = "deliverycrate3"
else
P.icon_state = "deliverycrate4"
P.wrapped = O
O.loc = P
P.add_fingerprint(usr)
@@ -153,8 +153,6 @@
if(istype(P,/obj/item/projectile/beam)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/ion)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/energy)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/beam/bluetag)) src.Artifact_Activate()
else if(istype(P,/obj/item/projectile/beam/redtag)) src.Artifact_Activate()
if (my_effect.trigger == "heat")
if(istype(P,/obj/item/projectile/temp)) src.Artifact_Activate()
@@ -221,7 +221,7 @@
findarti++
cur_artifact = A
if (findarti == 1)
if(cur_artifact.being_used)
if(cur_artifact && cur_artifact.being_used)
var/message = "<b>[src]</b> states, \"Cannot analyse. Excess energy drain is disrupting signal.\""
src.visible_message(message, message)
else
@@ -60,10 +60,8 @@
user << "\blue You feel a soothing energy invigorate you."
var/mob/living/carbon/human/H = user
for(var/A in H.organs)
var/datum/organ/external/affecting = null
if(!H.organs[A]) continue
affecting = H.organs[A]
for(var/datum/organ/external/affecting in H.organs)
if(!affecting) continue
if(!istype(affecting, /datum/organ/external)) continue
affecting.heal_damage(25, 25) //fixes getting hit after ingestion, killing you when game updates organ health
//user:heal_organ_damage(25, 25)
@@ -145,6 +143,8 @@
randomturfs.Add(T)
if(randomturfs.len > 0)
user << "\red You are suddenly zapped away elsewhere!"
if (user.buckled)
user.buckled.unbuckle()
user.loc = pick(randomturfs)
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, get_turf(originator)) //no idea what the 0 is
@@ -336,6 +336,8 @@
randomturfs.Add(T)
if(randomturfs.len > 0)
M << "\red You are displaced by a strange force!"
if(M.buckled)
M.buckled.unbuckle()
M.loc = pick(randomturfs)
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, get_turf(originator)) //no idea what the 0 is
@@ -423,6 +425,8 @@
randomturfs.Add(T)
if(randomturfs.len > 0)
M << "\red You are displaced by a strange force!"
if(M.buckled)
M.buckled.unbuckle()
M.loc = pick(randomturfs)
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, get_turf(originator)) //no idea what the 0 is
+5
View File
@@ -20,6 +20,7 @@
#define MIN_PLASMA_DAMAGE 20
#define BREATH_VOLUME 0.5 //liters in a normal breath
#define BREATH_MOLES (ONE_ATMOSPHERE * BREATH_VOLUME /(T20C*R_IDEAL_GAS_EQUATION))
#define BREATH_PERCENTAGE BREATH_VOLUME/CELL_VOLUME
//Amount of air to take a from a tile
#define HUMAN_NEEDED_OXYGEN MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16
@@ -351,6 +352,7 @@ var/MAX_EXPLOSION_RANGE = 14
//2spooky
#define SKELETON 29
#define PLANT 30
// Other Mutations:
#define mNobreath 100 // no need to breathe
@@ -595,3 +597,6 @@ var/list/TAGGERLOCATIONS = list("Disposals",
#define HOSTILE_STANCE_ATTACK 3
#define HOSTILE_STANCE_ATTACKING 4
#define HOSTILE_STANCE_TIRED 5
#define LEFT 1
#define RIGHT 2
+3 -1
View File
@@ -18,8 +18,8 @@
src.load_mode()
src.load_motd()
src.load_mods()
src.load_admins()
src.load_mods()
investigate_reset()
if (config.usewhitelist)
load_whitelist()
@@ -147,6 +147,8 @@ Starting up. [time2text(world.timeofday, "hh:mm.ss")]
if(revdata) s["revision"] = revdata.revision
s["admins"] = admins
s["end"] = "end"
return list2params(s)
+11 -4
View File
@@ -18,6 +18,7 @@ fniff: Sarah Calvera: /obj/item/fluff/sarah_calvera_1
fniff: Angleo Wilkerson: /obj/item/fluff/angelo_wilkerson_1
foolamancer: Edvin Telephosphor: /obj/item/clothing/head/fluff/edvin_telephosphor_1
furohman: Fay Sullivan: /obj/item/weapon/lighter/zippo/fluff/fay_sullivan_1
furlucis: Chal Appara: /obj/item/clothing/gloves/fluff/chal_appara_1
gvazdas: Sarah Carbrokes: /obj/item/fluff/sarah_carbrokes_1
jamini: Edwin Atweeke: /obj/item/clothing/suit/labcoat/fluff/burnt
kirbyelder: John McKeever: /obj/item/paper/fluff/john_mckeever_1
@@ -26,23 +27,31 @@ lexusjjss: Lexus Langg: /obj/item/weapon/clipboard/fluff/smallnote, /obj/item/we
lexusjjss: Zachary Tomlinson: /obj/item/weapon/clipboard/fluff/smallnote, /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/shinyflask
madmalicemccrea: Alice McCrea: /obj/item/clothing/head/welding/fluff/alice_mccrea_1
mangled: Li Matsuda: /obj/item/weapon/lighter/zippo/fluff/li_matsuda_1
maximumbob: Maurice Bedford: /obj/item/fluff/maurice_bedford_1
mcgulliver: Wox Derax: /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/lithiumflask
misterbook: Smoke Perkins: /obj/item/clothing/mask/cigarette/pipe
misterfox: Rashid Siraj: /obj/item/weapon/storage/bible/tajaran
morrinn: Maye Day: /obj/item/weapon/storage/fluff/maye_daye_1
naples: Russell Vierson: /obj/item/weapon/lighter/zippo/fluff/naples_1
nerezza: Asher Spock: /obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1
nerezza: Asher Spock: /obj/item/weapon/card/id/fluff/asher_spock_2
orangebottle: Lillian Levett: /obj/item/weapon/pen/fluff/fancypen
orangebottle: Lilliana Reade: /obj/item/weapon/pen/fluff/fancypen
paththegreat: Eli Stevens: /obj/item/weapon/pen/fluff/fountainpen
phaux: Tian Krieger: /obj/item/clothing/under/fluff/tian_dress
rawrtaicho: Riley Rohtin: /obj/item/weapon/lighter/zippo/fluff/riley_rohtin_1
roaper: Enos Adlai: /obj/item/clothing/head/fluff/enos_adlai_1
roaper: Ian Colm: /obj/item/weapon/card/id/fluff/ian_colm_1
roaper: Ian Colm: /obj/item/clothing/glasses/welding/fluff/ian_colm_2
rukral: Nashida Bisha'ra: /obj/item/weapon/reagent_containers/glass/beaker/large/fluff/nashida_bishara_1
searif: Yuki Matsuda: /obj/item/clothing/under/fluff/jumpsuitdown, /obj/item/clothing/head/welding/fluff/yuki_matsuda_1
searif: Ara Al-Jazari: /obj/item/clothing/under/rank/bartender/fluff/classy
serithi: Serithi Artalis: /obj/item/clothing/glasses/fluff/serithi_artalis_1, /obj/item/clothing/shoes/fluff/leatherboots
sirribbit: /obj/item/weapon/clipboard/fluff/mcreary_journal
sicktrigger: David Fanning: /obj/item/fluff/david_fanning_1
silentthunder: Val McNeil: /obj/item/fluff/val_mcneil_1
sniperyeti: Susan Harris: /obj/item/clothing/shoes/magboots/fluff/susan_harris_1
spaceman96: Trenna Seber: /obj/item/weapon/pen/fluff/multi, /obj/item/clothing/suit/labcoat/fluff/pink
sparklysheep: Cado Keppel: /obj/item/weapon/fluff/cado_keppel_1
sparklysheep: Uzenwa Sissra: /obj/item/clothing/glasses/fluff/uzenwa_sissra_1
staghorn: Mara Kilpatrick: /obj/item/clothing/mask/mara_kilpatrick_1
tastyfish: Cindy Robertson: /obj/item/weapon/wrapping_paper
thatoneguy: Hugo Cinderbatch: /obj/item/weapon/fluff/hugo_cinderbacth_1
@@ -53,5 +62,3 @@ tzefa: Wes Solari: /obj/item/fluff/wes_solari_1
vinceluk: Seth Sealis: /obj/item/clothing/suit/det_suit/fluff/graycoat
whitellama: Ethan Way: /obj/item/fluff/ethan_way_1
whitewolf41: Jeremy Wolf: /obj/item/clothing/under/rank/security/fluff/jeremy_wolf_1
roaper: Ian Colm: /obj/item/weapon/card/id/fluff/ian_colmid
+14
View File
@@ -56,6 +56,14 @@ Stuff which is in development and not yet visible to players or just code relate
should be listed in the changelog upon commit though. Thanks. -->
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here -->
<div class="commit sansserif">
<h2 class="date">23.11.12</h2>
<h3 class="author">CIB updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Cryo now temporarily stops bleeding, meaning you can shove the patient in there while you prepare IV and surgery.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">14.11.12</h2>
<h3 class="author">Chinsky updated:</h3>
@@ -63,6 +71,12 @@ should be listed in the changelog upon commit though. Thanks. -->
<li class="tweak">Virologist are now alt title of Medical Doctor, like Surgeon or EMT. All medical jobs now have virology access.</li>
<li class="rscadd">Added scientist alt titles.</li>
</ul>
<h3 class="author">CIB updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Lungs can now rupture from exposure to low oxygen environments. Use alien-surgery, and then scalpel instead of hemostat, to fix.</li>
<li class="tweak">Bandage/ointment healing sped up by a factor 10.</li>
<li class="rscadd">Ported autopsy.</li>
</ul>
</div>
<div class="commit sansserif">
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 35 KiB

+8750 -8736
View File
File diff suppressed because it is too large Load Diff