mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-22 19:47:22 +01:00
This commit is contained in:
@@ -215,7 +215,7 @@
|
||||
// world << sound('sound/AI/outbreak7.ogg')
|
||||
var/virus_type
|
||||
if(!virus)
|
||||
virus_type = pick(/datum/disease/dnaspread,/datum/disease/flu,/datum/disease/cold,/datum/disease/brainrot,/datum/disease/magnitis,/datum/disease/pierrot_throat)
|
||||
virus_type = pick(/datum/disease/dnaspread,/datum/disease/flu,/datum/disease/cold,/datum/disease/brainrot,/datum/disease/magnitis)
|
||||
else
|
||||
switch(virus)
|
||||
if("fake gbs")
|
||||
|
||||
@@ -119,6 +119,95 @@ datum/objective/mutiny/rp
|
||||
return 0
|
||||
return 1
|
||||
|
||||
datum/objective/anti_revolution/execute
|
||||
find_target()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute \him[target.current]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
|
||||
find_target_by_role(role, role_type=0)
|
||||
..(role, role_type)
|
||||
if(target && target.current)
|
||||
explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has extracted confidential information above their clearance. Execute \him[target.current]."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
check_completion()
|
||||
if(target && target.current)
|
||||
if(target.current.stat == DEAD || !ishuman(target.current))
|
||||
return 1
|
||||
return 0
|
||||
return 1
|
||||
|
||||
datum/objective/anti_revolution/brig
|
||||
var/already_completed = 0
|
||||
|
||||
find_target()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
|
||||
find_target_by_role(role, role_type=0)
|
||||
..(role, role_type)
|
||||
if(target && target.current)
|
||||
explanation_text = "Brig [target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] for 20 minutes to set an example."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
check_completion()
|
||||
if(already_completed)
|
||||
return 1
|
||||
|
||||
if(target && target.current)
|
||||
if(target.current.stat == DEAD)
|
||||
return 0
|
||||
if(target.is_brigged(10 * 60 * 10))
|
||||
already_completed = 1
|
||||
return 1
|
||||
return 0
|
||||
return 0
|
||||
|
||||
datum/objective/anti_revolution/demote
|
||||
find_target()
|
||||
..()
|
||||
if(target && target.current)
|
||||
explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
find_target_by_role(role, role_type=0)
|
||||
..(role, role_type)
|
||||
if(target && target.current)
|
||||
explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to NanoTrasen's goals. Demote \him[target.current] to assistant."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
check_completion()
|
||||
if(target && target.current && istype(target,/mob/living/carbon/human))
|
||||
var/obj/item/weapon/card/id/I = target.current:wear_id
|
||||
if(istype(I, /obj/item/device/pda))
|
||||
var/obj/item/device/pda/P = I
|
||||
I = P.id
|
||||
|
||||
if(!istype(I)) return 1
|
||||
|
||||
if(I.assignment == "Assistant")
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return 1
|
||||
|
||||
datum/objective/debrain//I want braaaainssss
|
||||
find_target()
|
||||
|
||||
@@ -0,0 +1,222 @@
|
||||
// A sort of anti-revolution where the heads are given objectives to mess with the crew
|
||||
|
||||
/datum/game_mode/anti_revolution
|
||||
name = "anti-revolution"
|
||||
config_tag = "anti-revolution"
|
||||
required_players = 5
|
||||
|
||||
var/finished = 0
|
||||
var/checkwin_counter = 0
|
||||
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
|
||||
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
|
||||
|
||||
var/required_execute_targets = 1
|
||||
var/required_brig_targets = 0
|
||||
|
||||
var/recommended_execute_targets = 1
|
||||
var/recommended_brig_targets = 3
|
||||
var/recommended_demote_targets = 3
|
||||
|
||||
var/list/datum/mind/heads = list()
|
||||
var/list/datum/mind/execute_targets = list()
|
||||
var/list/datum/mind/brig_targets = list()
|
||||
var/list/datum/mind/demote_targets = list()
|
||||
|
||||
///////////////////////////
|
||||
//Announces the game type//
|
||||
///////////////////////////
|
||||
/datum/game_mode/anti_revolution/announce()
|
||||
world << "<B>The current game mode is - Anti-Revolution!</B>"
|
||||
world << "<B>Looks like CentComm has given a few new orders..</B>"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//Gets the round setup, cancelling if there's not enough players at the start//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
/datum/game_mode/anti_revolution/pre_setup()
|
||||
for(var/mob/new_player/player in world) if(player.mind)
|
||||
if(player.mind.assigned_role in command_positions)
|
||||
heads += player.mind
|
||||
else
|
||||
if(execute_targets.len < recommended_execute_targets)
|
||||
execute_targets += player.mind
|
||||
else if(brig_targets.len < recommended_brig_targets)
|
||||
brig_targets += player.mind
|
||||
else if(demote_targets.len < recommended_demote_targets)
|
||||
demote_targets += player.mind
|
||||
|
||||
|
||||
if(heads.len==0)
|
||||
return 0
|
||||
|
||||
if(execute_targets.len < required_execute_targets || brig_targets.len < required_brig_targets)
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/proc/add_head_objectives(datum/mind/head)
|
||||
for(var/datum/mind/target in execute_targets)
|
||||
var/datum/objective/anti_revolution/execute/obj = new
|
||||
obj.owner = head
|
||||
obj.target = target
|
||||
obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute them."
|
||||
head.objectives += obj
|
||||
for(var/datum/mind/target in brig_targets)
|
||||
var/datum/objective/anti_revolution/brig/obj = new
|
||||
obj.owner = head
|
||||
obj.target = target
|
||||
obj.explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example."
|
||||
head.objectives += obj
|
||||
for(var/datum/mind/target in demote_targets)
|
||||
var/datum/objective/anti_revolution/demote/obj = new
|
||||
obj.owner = head
|
||||
obj.target = target
|
||||
obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to NanoTrasen's goals. Demote them to assistant."
|
||||
head.objectives += obj
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/post_setup()
|
||||
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
add_head_objectives(head_mind)
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
greet_head(head_mind)
|
||||
modePlayer += heads
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
..()
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/process()
|
||||
checkwin_counter++
|
||||
if(checkwin_counter >= 5)
|
||||
if(!finished)
|
||||
ticker.mode.check_win()
|
||||
checkwin_counter = 0
|
||||
return 0
|
||||
|
||||
|
||||
/datum/game_mode/proc/greet_head(var/datum/mind/head_mind, var/you_are=1)
|
||||
var/obj_count = 1
|
||||
if (you_are)
|
||||
head_mind.current << "\blue It looks like this shift CentComm has some special orders for you.. check your objectives."
|
||||
head_mind.current << "\blue Note that you can ignore these objectives, but resisting NT's orders probably means demotion or worse."
|
||||
for(var/datum/objective/objective in head_mind.objectives)
|
||||
head_mind.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
|
||||
head_mind.special_role = "Corrupt Head"
|
||||
obj_count++
|
||||
|
||||
head_mind.current.verbs += /mob/proc/ResignFromHeadPosition
|
||||
|
||||
//////////////////////////////////////
|
||||
//Checks if the revs have won or not//
|
||||
//////////////////////////////////////
|
||||
/datum/game_mode/anti_revolution/check_win()
|
||||
if(check_head_victory())
|
||||
finished = 1
|
||||
else if(check_crew_victory())
|
||||
finished = 2
|
||||
return
|
||||
|
||||
///////////////////////////////
|
||||
//Checks if the round is over//
|
||||
///////////////////////////////
|
||||
/datum/game_mode/anti_revolution/check_finished()
|
||||
if(finished != 0)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
|
||||
//////////////////////////
|
||||
//Checks for crew victory//
|
||||
//////////////////////////
|
||||
/datum/game_mode/anti_revolution/proc/check_crew_victory()
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
var/turf/T = get_turf(head_mind.current)
|
||||
if((head_mind) && (head_mind.current) && (head_mind.current.stat != 2) && T && (T.z == 1) && !head_mind.is_brigged(600))
|
||||
if(ishuman(head_mind.current))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/////////////////////////////
|
||||
//Checks for a head victory//
|
||||
/////////////////////////////
|
||||
/datum/game_mode/anti_revolution/proc/check_head_victory()
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
for(var/datum/objective/objective in head_mind.objectives)
|
||||
if(!(objective.check_completion()))
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/declare_completion()
|
||||
|
||||
var/text = ""
|
||||
if(finished == 2)
|
||||
world << "\red <FONT size = 3><B> The heads of staff were relieved of their posts! The crew wins!</B></FONT>"
|
||||
else if(finished == 1)
|
||||
world << "\red <FONT size = 3><B> The heads of staff managed to meet the goals set for them by CentComm!</B></FONT>"
|
||||
|
||||
|
||||
|
||||
world << "<FONT size = 2><B>The heads of staff were: </B></FONT>"
|
||||
var/list/heads = list()
|
||||
heads = get_all_heads()
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
text = ""
|
||||
if(head_mind.current)
|
||||
text += "[head_mind.current.real_name]"
|
||||
if(head_mind.current.stat == 2)
|
||||
text += " (Dead)"
|
||||
else
|
||||
text += " (Survived!)"
|
||||
else
|
||||
text += "[head_mind.key] (character destroyed)"
|
||||
|
||||
world << text
|
||||
|
||||
|
||||
world << "<FONT size = 2><B>Their objectives were: </B></FONT>"
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
if(head_mind.objectives.len)//If the traitor had no objectives, don't need to process this.
|
||||
var/count = 1
|
||||
for(var/datum/objective/objective in head_mind.objectives)
|
||||
if(objective.check_completion())
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
|
||||
feedback_add_details("head_objective","[objective.type]|SUCCESS")
|
||||
else
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
|
||||
feedback_add_details("head_objective","[objective.type]|FAIL")
|
||||
count++
|
||||
break // just print once
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/anti_revolution/latespawn(mob/living/carbon/human/character)
|
||||
..()
|
||||
if(emergency_shuttle.departed)
|
||||
return
|
||||
|
||||
if(character.mind.assigned_role in command_positions)
|
||||
heads += character.mind
|
||||
modePlayer += character.mind
|
||||
add_head_objectives(character.mind)
|
||||
greet_head(character.mind)
|
||||
|
||||
/mob/proc/ResignFromHeadPosition()
|
||||
set category = "IC"
|
||||
set name = "Resign From Head Position"
|
||||
|
||||
if(!istype(ticker.mode, /datum/game_mode/anti_revolution))
|
||||
return
|
||||
|
||||
ticker.mode:heads -= src.mind
|
||||
src.mind.objectives = list()
|
||||
ticker.mode.modePlayer -= src.mind
|
||||
src.mind.special_role = null
|
||||
|
||||
src.verbs -= /mob/proc/ResignFromHeadPosition
|
||||
|
||||
src << "\red You resigned from your position, now you have the consequences."
|
||||
@@ -67,7 +67,6 @@
|
||||
modePlayer += head_revolutionaries
|
||||
spawn (rand(waittime_l, waittime_h))
|
||||
send_intercept()
|
||||
..()
|
||||
|
||||
/datum/game_mode/revolution/rp_revolution/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1)
|
||||
var/obj_count = 1
|
||||
@@ -108,6 +107,14 @@
|
||||
return 0
|
||||
return 1
|
||||
|
||||
///////////////////////////
|
||||
//Announces the game type//
|
||||
///////////////////////////
|
||||
/datum/game_mode/revolution/rp_revolution/announce()
|
||||
world << "<B>The current game mode is - Revolution!</B>"
|
||||
world << "<B>Some crewmembers are attempting to start a revolution!</B>"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//Announces the end of the game with all relavent information stated//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
@@ -130,10 +137,11 @@
|
||||
|
||||
/mob/living/carbon/human/proc/RevConvert(mob/M as mob in oview(src))
|
||||
set name = "Rev-Convert"
|
||||
set category = "IC"
|
||||
if(((src.mind in ticker.mode:head_revolutionaries) || (src.mind in ticker.mode:revolutionaries)))
|
||||
if((M.mind in ticker.mode:head_revolutionaries) || (M.mind in ticker.mode:revolutionaries))
|
||||
src << "\red <b>[M] is already be a revolutionary!</b>"
|
||||
else if(ticker.mode:is_convertible(M))
|
||||
else if(!ticker.mode:is_convertible(M))
|
||||
src << "\red <b>[M] is implanted with a loyalty implant - Remove it first!</b>"
|
||||
else
|
||||
if(world.time < M.mind.rev_cooldown)
|
||||
@@ -156,37 +164,37 @@
|
||||
// only perform rev checks once in a while
|
||||
if(tried_to_add_revheads < world.time)
|
||||
tried_to_add_revheads = world.time+50
|
||||
var/active_revs = 0
|
||||
for(var/datum/mind/rev_mind in head_revolutionaries)
|
||||
var/active_revs = 0
|
||||
if(rev_mind.current.client && rev_mind.current.client.inactivity <= 10*60*20) // 20 minutes inactivity are OK
|
||||
active_revs++
|
||||
|
||||
if(active_revs == 0)
|
||||
log_admin("There are zero active head revolutionists, trying to add some..")
|
||||
message_admins("There are zero active head revolutionists, trying to add some..")
|
||||
var/added_heads = 0
|
||||
for(var/mob/living/carbon/human/H in world) if(H.client && H.mind && H.client.inactivity <= 10*60*20 && H.mind in revolutionaries)
|
||||
head_revolutionaries += H.mind
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
var/datum/objective/mutiny/rp/rev_obj = new
|
||||
rev_obj.owner = H.mind
|
||||
rev_obj.target = head_mind
|
||||
rev_obj.explanation_text = "Assassinate or capture [head_mind.name], the [head_mind.assigned_role]."
|
||||
H.mind.objectives += rev_obj
|
||||
if(active_revs == 0)
|
||||
log_admin("There are zero active head revolutionists, trying to add some..")
|
||||
message_admins("There are zero active head revolutionists, trying to add some..")
|
||||
var/added_heads = 0
|
||||
for(var/mob/living/carbon/human/H in world) if(H.client && H.mind && H.client.inactivity <= 10*60*20 && H.mind in revolutionaries)
|
||||
head_revolutionaries += H.mind
|
||||
for(var/datum/mind/head_mind in heads)
|
||||
var/datum/objective/mutiny/rp/rev_obj = new
|
||||
rev_obj.owner = H.mind
|
||||
rev_obj.target = head_mind
|
||||
rev_obj.explanation_text = "Assassinate or capture [head_mind.name], the [head_mind.assigned_role]."
|
||||
H.mind.objectives += rev_obj
|
||||
|
||||
update_rev_icons_added(H.mind)
|
||||
H.verbs += /mob/living/carbon/human/proc/RevConvert
|
||||
update_rev_icons_added(H.mind)
|
||||
H.verbs += /mob/living/carbon/human/proc/RevConvert
|
||||
|
||||
H << "\red Congratulations, yer heads of revolution are all gone now, so yer earned yourself a promotion."
|
||||
added_heads = 1
|
||||
break
|
||||
H << "\red Congratulations, yer heads of revolution are all gone now, so yer earned yourself a promotion."
|
||||
added_heads = 1
|
||||
break
|
||||
|
||||
if(added_heads)
|
||||
log_admin("Managed to add new heads of revolution.")
|
||||
message_admins("Managed to add new heads of revolution.")
|
||||
else
|
||||
log_admin("Unable to add new heads of revolution.")
|
||||
message_admins("Unable to add new heads of revolution.")
|
||||
tried_to_add_revheads = world.time + 6000 // wait 10 minutes
|
||||
if(added_heads)
|
||||
log_admin("Managed to add new heads of revolution.")
|
||||
message_admins("Managed to add new heads of revolution.")
|
||||
else
|
||||
log_admin("Unable to add new heads of revolution.")
|
||||
message_admins("Unable to add new heads of revolution.")
|
||||
tried_to_add_revheads = world.time + 6000 // wait 10 minutes
|
||||
|
||||
return ..()
|
||||
@@ -262,9 +262,6 @@
|
||||
if(!D.hidden[SCANNER])
|
||||
dat += text("<font color='red'><B>Warning: [D.form] Detected</B>\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]</FONT><BR>")
|
||||
|
||||
if (occupant.virus2 || occupant.reagents.reagent_list.len > 0)
|
||||
dat += text("<font color='red'>Warning: Foreign substances detected in bloodstream.</FONT>")
|
||||
|
||||
dat += "<HR><table border='1'>"
|
||||
dat += "<tr>"
|
||||
dat += "<th>Organ</th>"
|
||||
@@ -273,8 +270,7 @@
|
||||
dat += "<th>Other Wounds</th>"
|
||||
dat += "</tr>"
|
||||
|
||||
for(var/name in occupant.organs)
|
||||
var/datum/organ/external/e = occupant.organs[name]
|
||||
for(var/datum/organ/external/e in occupant.organs)
|
||||
dat += "<tr>"
|
||||
var/AN = ""
|
||||
var/open = ""
|
||||
@@ -282,6 +278,10 @@
|
||||
var/imp = ""
|
||||
var/bled = ""
|
||||
var/splint = ""
|
||||
var/internal_bleeding = ""
|
||||
for(var/datum/wound/W in e.wounds) if(W.internal)
|
||||
internal_bleeding = "Internal Bleeding:"
|
||||
break
|
||||
if(e.status & ORGAN_SPLINTED)
|
||||
splint = "Splinted:"
|
||||
if(e.status & ORGAN_BLEEDING)
|
||||
@@ -295,7 +295,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]</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]</td>"
|
||||
else
|
||||
dat += "<td>[e.display_name]</td><td>-</td><td>-</td><td>Not Found</td>"
|
||||
dat += "</tr>"
|
||||
|
||||
@@ -301,6 +301,7 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
|
||||
target_types += /obj/effect/decal/cleanable/vomit
|
||||
target_types += /obj/effect/decal/cleanable/robot_debris
|
||||
target_types += /obj/effect/decal/cleanable/crayon
|
||||
target_types += /obj/effect/decal/cleanable/liquid_fuel
|
||||
|
||||
if(src.blood)
|
||||
target_types += /obj/effect/decal/cleanable/xenoblood/
|
||||
|
||||
@@ -53,9 +53,20 @@
|
||||
if(3.0)
|
||||
dat += text("<B>Records Maintenance</B><HR>\n<A href='?src=\ref[];back=1'>Backup To Disk</A><BR>\n<A href='?src=\ref[];u_load=1'>Upload From disk</A><BR>\n<A href='?src=\ref[];del_all=1'>Delete All Records</A><BR>\n<BR>\n<A href='?src=\ref[];screen=1'>Back</A>", src, src, src, src)
|
||||
if(4.0)
|
||||
var/icon/front = new(active1.fields["photo"], dir = SOUTH)
|
||||
var/icon/side = new(active1.fields["photo"], dir = WEST)
|
||||
user << browse_rsc(front, "front.png")
|
||||
user << browse_rsc(side, "side.png")
|
||||
dat += "<CENTER><B>Medical Record</B></CENTER><BR>"
|
||||
if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
|
||||
dat += text("Name: [] ID: []<BR>\nSex: <A href='?src=\ref[];field=sex'>[]</A><BR>\nAge: <A href='?src=\ref[];field=age'>[]</A><BR>\nFingerprint: <A href='?src=\ref[];field=fingerprint'>[]</A><BR>\nPhysical Status: <A href='?src=\ref[];field=p_stat'>[]</A><BR>\nMental Status: <A href='?src=\ref[];field=m_stat'>[]</A><BR>", src.active1.fields["name"], src.active1.fields["id"], src, src.active1.fields["sex"], src, src.active1.fields["age"], src, src.active1.fields["fingerprint"], src, src.active1.fields["p_stat"], src, src.active1.fields["m_stat"])
|
||||
dat += "<table><tr><td>Name: [active1.fields["name"]] \
|
||||
ID: [active1.fields["id"]]<BR>\n \
|
||||
Sex: <A href='?src=\ref[src];field=sex'>[active1.fields["sex"]]</A><BR>\n \
|
||||
Age: <A href='?src=\ref[src];field=age'>[active1.fields["age"]]</A><BR>\n \
|
||||
Fingerprint: <A href='?src=\ref[src];field=fingerprint'>[active1.fields["fingerprint"]]</A><BR>\n \
|
||||
Physical Status: <A href='?src=\ref[src];field=p_stat'>[active1.fields["p_stat"]]</A><BR>\n \
|
||||
Mental Status: <A href='?src=\ref[src];field=m_stat'>[active1.fields["m_stat"]]</A><BR></td><td align = center valign = top> \
|
||||
Photo:<br><img src=front.png height=64 width=64 border=5><img src=side.png height=64 width=64 border=5></td></tr></table>"
|
||||
else
|
||||
dat += "<B>General Record Lost!</B><BR>"
|
||||
if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
|
||||
@@ -84,6 +95,8 @@
|
||||
dat += "<br><b>Medical Robots:</b>"
|
||||
var/bdat = null
|
||||
for(var/obj/machinery/bot/medbot/M in world)
|
||||
if(!M)
|
||||
continue
|
||||
var/turf/bl = get_turf(M)
|
||||
bdat += "[M.name] - <b>\[[bl.x],[bl.y]\]</b> - [M.on ? "Online" : "Offline"]<br>"
|
||||
if((!isnull(M.reagent_glass)) && M.use_beaker)
|
||||
|
||||
@@ -105,9 +105,23 @@
|
||||
dat += "<B>Records Maintenance</B><HR>"
|
||||
dat += "<BR><A href='?src=\ref[src];choice=Delete All Records'>Delete All Records</A><BR><BR><A href='?src=\ref[src];choice=Return'>Back</A>"
|
||||
if(3.0)
|
||||
var/icon/front = new(active1.fields["photo"], dir = SOUTH)
|
||||
var/icon/side = new(active1.fields["photo"], dir = WEST)
|
||||
user << browse_rsc(front, "front.png")
|
||||
user << browse_rsc(side, "side.png")
|
||||
dat += "<CENTER><B>Security Record</B></CENTER><BR>"
|
||||
if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
|
||||
dat += text("Name: <A href='?src=\ref[];choice=Edit Field;field=name'>[]</A> ID: <A href='?src=\ref[];choice=Edit Field;field=id'>[]</A><BR>\nSex: <A href='?src=\ref[];choice=Edit Field;field=sex'>[]</A><BR>\nAge: <A href='?src=\ref[];choice=Edit Field;field=age'>[]</A><BR>\nRank: <A href='?src=\ref[];choice=Edit Field;field=rank'>[]</A><BR>\nFingerprint: <A href='?src=\ref[];choice=Edit Field;field=fingerprint'>[]</A><BR>\nPhysical Status: []<BR>\nMental Status: []<BR>", src, active1.fields["name"], src, active1.fields["id"], src, active1.fields["sex"], src, active1.fields["age"], src, active1.fields["rank"], src, active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"])
|
||||
dat += text("<table><tr><td> \
|
||||
Name: <A href='?src=\ref[src];choice=Edit Field;field=name'>[active1.fields["name"]]</A><BR> \
|
||||
ID: <A href='?src=\ref[src];choice=Edit Field;field=id'>[active1.fields["id"]]</A><BR>\n \
|
||||
Sex: <A href='?src=\ref[src];choice=Edit Field;field=sex'>[active1.fields["sex"]]</A><BR>\n \
|
||||
Age: <A href='?src=\ref[src];choice=Edit Field;field=age'>[active1.fields["age"]]</A><BR>\n \
|
||||
Rank: <A href='?src=\ref[src];choice=Edit Field;field=rank'>[active1.fields["rank"]]</A><BR>\n \
|
||||
Fingerprint: <A href='?src=\ref[src];choice=Edit Field;field=fingerprint'>[active1.fields["fingerprint"]]</A><BR>\n \
|
||||
Physical Status: [active1.fields["p_stat"]]<BR>\n \
|
||||
Mental Status: [active1.fields["m_stat"]]<BR></td> \
|
||||
<td align = center valign = top>Photo:<br><img src=front.png height=80 width=80 border=4> \
|
||||
<img src=side.png height=80 width=80 border=4></td></tr></table>")
|
||||
else
|
||||
dat += "<B>General Record Lost!</B><BR>"
|
||||
if ((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
|
||||
|
||||
@@ -828,7 +828,15 @@ About the new airlock wires panel:
|
||||
src.aiHacking = 0
|
||||
src.attack_ai(user)
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if (src.isElectrified())
|
||||
if (istype(mover, /obj/item))
|
||||
var/obj/item/i = mover
|
||||
if (i.m_amt)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
return ..()
|
||||
/obj/machinery/door/airlock/attack_paw(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
|
||||
@@ -90,3 +90,23 @@
|
||||
update_icon()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/iv_drip/examine()
|
||||
set src in view()
|
||||
..()
|
||||
if (!(usr in view(2)) && usr!=src.loc) return
|
||||
|
||||
if(beaker)
|
||||
usr << "\blue Attached is \a [beaker] with:"
|
||||
if(beaker.reagents && beaker.reagents.reagent_list.len)
|
||||
for(var/datum/reagent/R in beaker.reagents.reagent_list)
|
||||
usr << "\blue [R.volume] units of [R.name]"
|
||||
else
|
||||
usr << "\blue Attached is an empty [beaker]."
|
||||
else
|
||||
usr << "\blue No chemicals are attached."
|
||||
|
||||
if(attached)
|
||||
usr << "\blue [attached] is attached."
|
||||
else
|
||||
usr << "\blue No one is attached."
|
||||
@@ -0,0 +1,58 @@
|
||||
obj/effect/decal/cleanable/liquid_fuel
|
||||
//Liquid fuel is used for things that used to rely on volatile fuels or plasma being contained to a couple tiles.
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "fuel"
|
||||
layer = TURF_LAYER+0.2
|
||||
anchored = 1
|
||||
var/amount = 1 //Basically moles.
|
||||
|
||||
New(newLoc,amt=1)
|
||||
src.amount = amt
|
||||
|
||||
//Be absorbed by any other liquid fuel in the tile.
|
||||
for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
|
||||
if(other != src)
|
||||
other.amount += src.amount
|
||||
spawn other.Spread()
|
||||
del src
|
||||
|
||||
Spread()
|
||||
. = ..()
|
||||
|
||||
proc/Spread()
|
||||
//Allows liquid fuels to sometimes flow into other tiles.
|
||||
if(amount < 0.5) return
|
||||
var/turf/simulated/S = loc
|
||||
if(!istype(S)) return
|
||||
for(var/d in cardinal)
|
||||
if(S.air_check_directions & d)
|
||||
if(rand(25))
|
||||
var/turf/simulated/O = get_step(src,d)
|
||||
var/can_pass = 1
|
||||
for (var/obj/machinery/door/airlock/door in O)
|
||||
if (door.density)
|
||||
can_pass = 0
|
||||
if (can_pass)
|
||||
if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in O)
|
||||
new/obj/effect/decal/cleanable/liquid_fuel(O,amount*0.25)
|
||||
amount *= 0.75
|
||||
|
||||
flamethrower_fuel
|
||||
icon_state = "mustard"
|
||||
anchored = 0
|
||||
New(newLoc, amt = 1, d = 0)
|
||||
dir = d //Setting this direction means you won't get torched by your own flamethrower.
|
||||
. = ..()
|
||||
Spread()
|
||||
//The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
|
||||
if(amount < 0.1) return
|
||||
var/turf/simulated/S = loc
|
||||
if(!istype(S)) return
|
||||
|
||||
for(var/d in list(turn(dir,90),turn(dir,-90)))
|
||||
if(S.air_check_directions & d)
|
||||
var/turf/simulated/O = get_step(S,d)
|
||||
new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
|
||||
O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
|
||||
|
||||
amount *= 0.5
|
||||
@@ -429,7 +429,8 @@ Code:
|
||||
|
||||
else
|
||||
for(var/obj/machinery/bot/secbot/B in SC.botlist)
|
||||
menu += "<A href='byond://?src=\ref[SC];op=control;bot=\ref[B]'>[B] at [B.loc.loc]</A><BR>"
|
||||
if (B)
|
||||
menu += "<A href='byond://?src=\ref[SC];op=control;bot=\ref[B]'>[B] at [B.loc.loc]</A><BR>"
|
||||
|
||||
menu += "<BR><A href='byond://?src=\ref[SC];op=scanbots'><img src=pda_scanner.png> Scan for active bots</A><BR>"
|
||||
|
||||
@@ -495,7 +496,8 @@ Code:
|
||||
|
||||
else
|
||||
for(var/obj/machinery/bot/mulebot/B in QC.botlist)
|
||||
menu += "<A href='byond://?src=\ref[QC];op=control;bot=\ref[B]'>[B] at [B.loc.loc]</A><BR>"
|
||||
if(B)
|
||||
menu += "<A href='byond://?src=\ref[QC];op=control;bot=\ref[B]'>[B] at [B.loc.loc]</A><BR>"
|
||||
|
||||
menu += "<BR><A href='byond://?src=\ref[QC];op=scanbots'><img src=pda_scanner.png> Scan for active bots</A><BR>"
|
||||
|
||||
|
||||
@@ -210,7 +210,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
if (!connection)
|
||||
return
|
||||
|
||||
Broadcast_Message(connection, new /mob/living/silicon/ai(src),
|
||||
Broadcast_Message(connection, new /mob/living/silicon/ai(src,null,null,1),
|
||||
0, "*garbled automated announcement*", src,
|
||||
message, from, "Automated Announcement", from, "synthesized voice",
|
||||
4, 0, 1)
|
||||
|
||||
@@ -25,6 +25,10 @@
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/datum/organ/external/affecting = H.get_organ("chest")
|
||||
|
||||
if(affecting.status & ORGAN_ROBOT)
|
||||
user << "\red This isn't useful at all on a robotic limb.."
|
||||
return 1
|
||||
|
||||
if(istype(user, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/user2 = user
|
||||
affecting = H.get_organ(check_zone(user2.zone_sel.selecting))
|
||||
|
||||
@@ -284,9 +284,12 @@
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!H.shoes)
|
||||
var/datum/organ/external/affecting = H.get_organ(pick("l_leg", "r_leg"))
|
||||
var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
|
||||
if(affecting.status & ORGAN_ROBOT)
|
||||
return
|
||||
|
||||
H.Weaken(3)
|
||||
if(affecting.take_damage(5, 0))
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
log_attack("<font color='red'> [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])</font>")
|
||||
user.visible_message("\red [user.name] is trying to plant some kind of explosive on [target.name]!")
|
||||
|
||||
log_admin("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])")
|
||||
msg_admin_attack("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])") //BS12 EDIT ALG
|
||||
log_admin("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])")
|
||||
msg_admin_attack("ATTACK: [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])") //BS12 EDIT ALG
|
||||
|
||||
if(do_after(user, 50) && in_range(user, target))
|
||||
user.drop_item()
|
||||
|
||||
@@ -192,11 +192,9 @@
|
||||
usr << "\red [src] is locked and cannot be opened!"
|
||||
else if ((src.loc == user) && (!src.locked))
|
||||
playsound(src.loc, "rustle", 50, 1, -5)
|
||||
if (user.s_active == src)
|
||||
if (user.s_active)
|
||||
user.s_active.close(user) //Close and re-open
|
||||
src.show_to(user)
|
||||
else
|
||||
user.s_active.close(user) //Just close
|
||||
src.show_to(user)
|
||||
else
|
||||
..()
|
||||
for(var/mob/M in range(1))
|
||||
|
||||
@@ -42,10 +42,15 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/* attackby(obj/item/weapon/W as obj, mob/user as mob) //BoH+BoH=Singularity, commented out
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(crit_fail)
|
||||
user << "\red The Bluespace generator isn't working."
|
||||
return
|
||||
if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail)
|
||||
user << "\red The Bluespace interfaces of the two devices conflict and malfunction."
|
||||
del(W)
|
||||
return
|
||||
/* //BoH+BoH=Singularity, commented out.
|
||||
if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail)
|
||||
investigate_log("has become a singularity. Caused by [user.key]","singulo")
|
||||
user << "\red The Bluespace interfaces of the two devices catastrophically malfunction!"
|
||||
@@ -56,8 +61,9 @@
|
||||
log_game("[key_name(user)] detonated a bag of holding")
|
||||
del(src)
|
||||
return
|
||||
*/
|
||||
..()
|
||||
*/
|
||||
|
||||
proc/failcheck(mob/user as mob)
|
||||
if (prob(src.reliability)) return 1 //No failure
|
||||
if (prob(src.reliability))
|
||||
|
||||
@@ -1,12 +1,5 @@
|
||||
/obj/item/weapon/storage/briefcase/New()
|
||||
..()
|
||||
new /obj/item/weapon/paper(src)
|
||||
new /obj/item/weapon/paper(src)
|
||||
new /obj/item/weapon/paper(src)
|
||||
new /obj/item/weapon/paper(src)
|
||||
new /obj/item/weapon/paper(src)
|
||||
new /obj/item/weapon/paper(src)
|
||||
new /obj/item/weapon/pen(src)
|
||||
|
||||
/obj/item/weapon/storage/briefcase/attack(mob/living/M as mob, mob/living/user as mob)
|
||||
//..()
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
T.status &= ~ORGAN_ATTACHABLE
|
||||
T.status &= ~ORGAN_DESTROYED
|
||||
T.status |= ORGAN_ROBOT
|
||||
M.update_body()
|
||||
H.update_body()
|
||||
M.updatehealth()
|
||||
M.UpdateDamageIcon()
|
||||
del(src)
|
||||
|
||||
@@ -231,9 +231,8 @@
|
||||
message_admins("[key_name_admin(user)] triggered a fueltank explosion.")
|
||||
log_game("[key_name(user)] triggered a fueltank explosion.")
|
||||
user << "\red That was stupid of you."
|
||||
explosion(O.loc,-1,0,2)
|
||||
if(O)
|
||||
del(O)
|
||||
var/obj/structure/reagent_dispensers/fueltank/tank = O
|
||||
tank.explode()
|
||||
return
|
||||
if (src.welding)
|
||||
remove_fuel(1)
|
||||
@@ -393,4 +392,24 @@
|
||||
var/gen_amount = ((world.time-last_gen)/25)
|
||||
reagents += (gen_amount)
|
||||
if(reagents > max_fuel)
|
||||
reagents = max_fuel
|
||||
reagents = max_fuel
|
||||
|
||||
/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]
|
||||
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help")
|
||||
return ..()
|
||||
if(S.brute_dam)
|
||||
S.heal_damage(15,0,0,1)
|
||||
if(user != M)
|
||||
user.visible_message("\red You patch some dents on \the [M]'s [S.display_name]",\
|
||||
"\red \The [user] patches some dents on \the [M]'s [S.display_name] with \the [src]",\
|
||||
"You hear a welder.")
|
||||
else
|
||||
user.visible_message("\red You patch some dents on your [S.display_name]",\
|
||||
"\red \The [user] patches some dents on their [S.display_name] with \the [src]",\
|
||||
"You hear a welder.")
|
||||
else
|
||||
user << "Nothing to fix!"
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -176,6 +176,8 @@
|
||||
new /obj/item/clothing/under/det(src)
|
||||
new /obj/item/clothing/suit/armor/det_suit(src)
|
||||
new /obj/item/clothing/suit/det_suit(src)
|
||||
new /obj/item/clothing/suit/forensics/blue(src)
|
||||
new /obj/item/clothing/suit/forensics/red(src)
|
||||
new /obj/item/clothing/gloves/black(src)
|
||||
new /obj/item/clothing/head/det_hat(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
|
||||
@@ -101,6 +101,16 @@
|
||||
if (istype(mover, /obj/item/projectile))
|
||||
return prob(30)
|
||||
else
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/structure/cable/C = T.get_cable_node()
|
||||
if(C)
|
||||
if (C.powernet.avail)
|
||||
if (istype(mover, /obj/item))
|
||||
var/obj/item/i = mover
|
||||
if (i.m_amt)
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
return !src.density
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user