Merge pull request #3488 from Baystation12/dev-freeze

Dev freeze
This commit is contained in:
Zuhayr
2013-08-11 22:00:01 -07:00
150 changed files with 16024 additions and 13658 deletions

View File

@@ -527,7 +527,7 @@ obj/machinery/atmospherics/pipe
var/build_killswitch = 1
var/obj/machinery/atmospherics/node1
New()
New()
initialize_directions = dir
..()
@@ -722,7 +722,7 @@ obj/machinery/atmospherics/pipe
icon_state = "manifold_[connected]_[unconnected]"
if(!connected)
if(!connected)
del(src)
return
@@ -951,7 +951,7 @@ obj/machinery/atmospherics/pipe
return
initialize()
for(var/obj/machinery/atmospherics/target in get_step(src,1))
if(target.initialize_directions & 2)
node1 = target
@@ -1028,7 +1028,7 @@ obj/machinery/atmospherics/pipe
manifold4w/general/hidden
level = 1
icon_state = "manifold4w-f"
cap
name = "pipe endcap"
desc = "An endcap for pipes"
@@ -1117,28 +1117,9 @@ obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/u
if (istype(src, /obj/machinery/atmospherics/pipe/vent))
return ..()
// ===== Handle paints =====
if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/red))
src.color = "red"
user << "\red You paint the pipe red."
update_icon()
if(istype(W,/obj/item/device/pipe_painter))
return 1
if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/blue))
src.color = "blue"
user << "\red You paint the pipe blue."
update_icon()
return 1
if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/green))
src.color = "green"
user << "\red You paint the pipe green."
update_icon()
return 1
if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/yellow))
src.color = "yellow"
user << "\red You paint the pipe yellow."
update_icon()
return 1
if (!istype(W, /obj/item/weapon/wrench))
return ..()
var/turf/T = src.loc

View File

@@ -2,7 +2,9 @@
// work in progress
var/const/members_possible = 5
var/sent_emergency_team = 0
var/const/members_required = 1 // We need at least *one* person ;_;
var/global/admin_emergency_team = 0 // Used for admin-spawned response teams
// 'sent_response_team' for automagic response teams
/client/proc/response_team()
set name = "Dispatch Emergency Response Team"
@@ -18,7 +20,7 @@ var/sent_emergency_team = 0
if(ticker.current_state == GAME_STATE_PREGAME)
usr << "\red The round hasn't started yet!"
return
if(sent_emergency_team == 1)
if(admin_emergency_team || send_emergency_team)
usr << "\red Central Command has already dispatched an emergency response team!"
return
if(alert("Do you want to dispatch an Emergency Response Team?",,"Yes","No") != "Yes")
@@ -35,11 +37,11 @@ var/sent_emergency_team = 0
if(alert("You haven't specified a mission. Exit the setup process?",,"No","Yes")=="Yes")
return
if(sent_emergency_team)
if(admin_emergency_team || send_emergency_team)
usr << "\red Looks like somebody beat you to it!"
return
sent_emergency_team = 1
admin_emergency_team = 1
message_admins("[key_name_admin(usr)] is dispatching an Emergency Response Team.", 1)
log_admin("[key_name(usr)] used Dispatch Response Team.")
@@ -87,6 +89,12 @@ var/sent_emergency_team = 0
sleep(300)
if(candidates.len < members_required)
message_admins("Not enough people signed up for [key_name_admin(usr)]'s response team! Aborting.")
log_admin("Response Team aborted: Not Enough Signups.")
admin_emergency_team = 0
return
for(var/i=members_possible,(i>0&&candidates.len), i--) // The rest of the choosing process is just an input with a list of candidates on it
var/chosen = input("Time's up! Choose characters to spawn as reponse team members. This will go on until there are no more ghosts to pick from or until all slots are full.", "Considered Players") as null|anything in candidates
candidates -= chosen
@@ -111,6 +119,7 @@ var/sent_emergency_team = 0
break
spawn(0)
switch(alert(new_member, "You are an Emergency Response Team member! Are you a boy or a girl?",,"Male","Female"))
if("Male")
new_member.gender = MALE
@@ -122,9 +131,12 @@ var/sent_emergency_team = 0
if(!new_name)
new_member.real_name = "Agent [pick("Red","Yellow","Orange","Silver","Gold", "Pink", "Purple", "Rainbow")]" // Choose a "random" agent name
new_member.name = usr.real_name
new_member.mind.name = usr.real_name
else
new_member.real_name = new_name
new_member.name = new_name
new_member.mind.name = new_name
// -- CHANGE APPEARANCE --
var/new_tone = input(new_member, "Please select your new skin tone: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as num
@@ -171,13 +183,16 @@ var/sent_emergency_team = 0
new_member.update_hair(1)
new_member.mind_initialize()
new_member.mind.assigned_role = "Emergency Response Team"
new_member.mind.special_role = "Emergency Response Team"
ticker.mode.traitors += new_member.mind // ERTs will show up at the end of the round on the "traitor" list
ticker.mode.traitors |= new_member.mind // ERTs will show up at the end of the round on the "traitor" list
// Join message
new_member << "\blue You are the <b>Emergency Response Team[!leader_selected?"!</b>":" Leader!</b>"] \nAs a response team [!leader_selected?"member":"<b>leader</b>"] you answer directly to [!leader_selected?"your team leader.":"Central Command."] \nYou have been deployed by NanoTrasen Central Command in Tau Ceti to resolve a Code Red alert aboard [station_name()], and have been provided with the following instructions and information regarding your mission: \red [situation]"
new_member.mind.store_memory("<b>Mission Parameters:</b> \red [situation].")
// Leader join message
if(leader_selected)
new_member << "\red The Nuclear Authentication Code is: <b> [nuke_code]</b>. You are instructed not to detonate the nuclear device aboard [station_name()] unless <u>absolutely necessary</u>."
new_member.mind.store_memory("<b>Nuclear Authentication Code:</b> \red [nuke_code]")
@@ -213,7 +228,7 @@ var/sent_emergency_team = 0
// Put stuff into their backpacks
equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid(src), slot_in_backpack) // Not sure about this
// equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(src), slot_in_backpack) // Regular medkit
// Loyalty implants
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(src)
@@ -235,5 +250,7 @@ var/sent_emergency_team = 0
E.registered_name = real_name
equip_to_slot_or_del(E, slot_wear_id)
update_icons()
return 1

View File

@@ -17,6 +17,11 @@ var/global/list/landmarks_list = list() //list of all landmarks created
var/global/list/surgery_steps = list() //list of all surgery steps |BS12
var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking.
//Languages/species/whitelist.
var/global/list/all_species[0]
var/global/list/all_languages[0]
var/global/list/whitelisted_species = list("Human")
//Preferences stuff
//Hairstyles
var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name
@@ -69,6 +74,21 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
var/datum/surgery_step/S = new T
surgery_steps += S
sort_surgeries()
//Languages and species.
paths = typesof(/datum/language)-/datum/language
for(var/T in paths)
var/datum/language/L = new T
all_languages[L.name] = L
paths = typesof(/datum/species)-/datum/species
for(var/T in paths)
var/datum/species/S = new T
all_species[S.name] = S
if(S.flags & WHITELISTED)
whitelisted_species += S.name
/* // Uncomment to debug chemical reaction list.
/client/verb/debug_chemical_list()

View File

@@ -45,381 +45,382 @@ datum/shuttle_controller
if(istype(A, /area/hallway))
A.readyalert()
proc/shuttlealert(var/X)
datum/shuttle_controller/proc/shuttlealert(var/X)
alert = X
proc/recall()
if(direction == 1)
var/timeleft = timeleft()
if(alert == 0)
if(timeleft >= 600)
return
captain_announce("The emergency shuttle has been recalled.")
world << sound('sound/AI/shuttlerecalled.ogg')
setdirection(-1)
online = 1
for(var/area/A in world)
if(istype(A, /area/hallway))
A.readyreset()
return
else //makes it possible to send shuttle back.
captain_announce("The shuttle has been recalled.")
setdirection(-1)
online = 1
alert = 0 // set alert back to 0 after an admin recall
datum/shuttle_controller/proc/recall()
if(direction == 1)
var/timeleft = timeleft()
if(alert == 0)
if(timeleft >= 600)
return
captain_announce("The emergency shuttle has been recalled.")
world << sound('sound/AI/shuttlerecalled.ogg')
setdirection(-1)
online = 1
for(var/area/A in world)
if(istype(A, /area/hallway))
A.readyreset()
return
else //makes it possible to send shuttle back.
captain_announce("The shuttle has been recalled.")
setdirection(-1)
online = 1
alert = 0 // set alert back to 0 after an admin recall
return
// returns the time (in seconds) before shuttle arrival
// note if direction = -1, gives a count-up to SHUTTLEARRIVETIME
proc/timeleft()
if(online)
var/timeleft = round((endtime - world.timeofday)/10 ,1)
if(direction == 1 || direction == 2)
return timeleft
else
return SHUTTLEARRIVETIME-timeleft
datum/shuttle_controller/proc/timeleft()
if(online)
var/timeleft = round((endtime - world.timeofday)/10 ,1)
if(direction == 1 || direction == 2)
return timeleft
else
return SHUTTLEARRIVETIME
return SHUTTLEARRIVETIME-timeleft
else
return SHUTTLEARRIVETIME
// sets the time left to a given delay (in seconds)
proc/settimeleft(var/delay)
endtime = world.timeofday + delay * 10
timelimit = delay
datum/shuttle_controller/proc/settimeleft(var/delay)
endtime = world.timeofday + delay * 10
timelimit = delay
// sets the shuttle direction
// 1 = towards SS13, -1 = back to centcom
proc/setdirection(var/dirn)
if(direction == dirn)
return
direction = dirn
// if changing direction, flip the timeleft by SHUTTLEARRIVETIME
var/ticksleft = endtime - world.timeofday
endtime = world.timeofday + (SHUTTLEARRIVETIME*10 - ticksleft)
datum/shuttle_controller/proc/setdirection(var/dirn)
if(direction == dirn)
return
direction = dirn
// if changing direction, flip the timeleft by SHUTTLEARRIVETIME
var/ticksleft = endtime - world.timeofday
endtime = world.timeofday + (SHUTTLEARRIVETIME*10 - ticksleft)
return
proc/process()
datum/shuttle_controller/proc/process()
emergency_shuttle
process()
if(!online)
return
var/timeleft = timeleft()
if(timeleft > 1e5) // midnight rollover protection
timeleft = 0
switch(location)
if(0)
datum/shuttle_controller/emergency_shuttle/process()
if(!online)
return
var/timeleft = timeleft()
if(timeleft > 1e5) // midnight rollover protection
timeleft = 0
switch(location)
if(0)
/* --- Shuttle is in transit to Central Command from SS13 --- */
if(direction == 2)
if(timeleft>0)
return 0
/* --- Shuttle is in transit to Central Command from SS13 --- */
if(direction == 2)
if(timeleft>0)
return 0
/* --- Shuttle has arrived at Centrcal Command --- */
else
// turn off the star spawners
/*
for(var/obj/effect/starspawner/S in world)
S.spawning = 0
*/
/* --- Shuttle has arrived at Centrcal Command --- */
else
// turn off the star spawners
/*
for(var/obj/effect/starspawner/S in world)
S.spawning = 0
*/
location = 2
location = 2
//main shuttle
var/area/start_location = locate(/area/shuttle/escape/transit)
var/area/end_location = locate(/area/shuttle/escape/centcom)
//main shuttle
var/area/start_location = locate(/area/shuttle/escape/transit)
var/area/end_location = locate(/area/shuttle/escape/centcom)
start_location.move_contents_to(end_location, null, NORTH)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/unpowered/D in machines)
if( get_area(D) == end_location )
spawn(0)
D.locked = 0
D.open()
for(var/obj/machinery/door/unpowered/shuttle/D in end_location)
spawn(0)
D.locked = 0
D.open()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
//pods
start_location = locate(/area/shuttle/escape_pod1/transit)
end_location = locate(/area/shuttle/escape_pod1/centcom)
start_location.move_contents_to(end_location, null, NORTH)
start_location = locate(/area/shuttle/escape_pod1/transit)
end_location = locate(/area/shuttle/escape_pod1/centcom)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in machines)
if( get_area(D) == end_location )
spawn(0)
D.open()
for(var/obj/machinery/door/D in machines)
if( get_area(D) == end_location )
spawn(0)
D.open()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
start_location = locate(/area/shuttle/escape_pod2/transit)
end_location = locate(/area/shuttle/escape_pod2/centcom)
start_location.move_contents_to(end_location, null, NORTH)
start_location = locate(/area/shuttle/escape_pod2/transit)
end_location = locate(/area/shuttle/escape_pod2/centcom)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in machines)
if( get_area(D) == end_location )
spawn(0)
D.open()
for(var/obj/machinery/door/D in machines)
if( get_area(D) == end_location )
spawn(0)
D.open()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
start_location = locate(/area/shuttle/escape_pod3/transit)
end_location = locate(/area/shuttle/escape_pod3/centcom)
start_location.move_contents_to(end_location, null, NORTH)
start_location = locate(/area/shuttle/escape_pod3/transit)
end_location = locate(/area/shuttle/escape_pod3/centcom)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in machines)
if( get_area(D) == end_location )
spawn(0)
D.open()
for(var/obj/machinery/door/D in machines)
if( get_area(D) == end_location )
spawn(0)
D.open()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
start_location = locate(/area/shuttle/escape_pod5/transit)
end_location = locate(/area/shuttle/escape_pod5/centcom)
start_location.move_contents_to(end_location, null, EAST)
start_location = locate(/area/shuttle/escape_pod5/transit)
end_location = locate(/area/shuttle/escape_pod5/centcom)
start_location.move_contents_to(end_location, null, EAST)
for(var/obj/machinery/door/D in machines)
if( get_area(D) == end_location )
spawn(0)
D.open()
for(var/obj/machinery/door/D in machines)
if( get_area(D) == end_location )
spawn(0)
D.open()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
online = 0
online = 0
return 1
return 1
/* --- Shuttle has docked centcom after being recalled --- */
if(timeleft>timelimit)
online = 0
direction = 1
endtime = null
if(timeleft>timelimit)
online = 0
direction = 1
endtime = null
return 0
return 0
else if((fake_recall != 0) && (timeleft <= fake_recall))
recall()
fake_recall = 0
return 0
else if((fake_recall != 0) && (timeleft <= fake_recall))
recall()
fake_recall = 0
return 0
/* --- Shuttle has docked with the station - begin countdown to transit --- */
else if(timeleft <= 0)
location = 1
var/area/start_location = locate(/area/shuttle/escape/centcom)
var/area/end_location = locate(/area/shuttle/escape/station)
else if(timeleft <= 0)
location = 1
var/area/start_location = locate(/area/shuttle/escape/centcom)
var/area/end_location = locate(/area/shuttle/escape/station)
var/list/dstturfs = list()
var/throwy = world.maxy
var/list/dstturfs = list()
var/throwy = world.maxy
for(var/turf/T in end_location)
dstturfs += T
if(T.y < throwy)
throwy = T.y
for(var/turf/T in end_location)
dstturfs += T
if(T.y < throwy)
throwy = T.y
// hey you, get out of the way!
for(var/turf/T in dstturfs)
// find the turf to move things to
var/turf/D = locate(T.x, throwy - 1, 1)
//var/turf/E = get_step(D, SOUTH)
for(var/atom/movable/AM as mob|obj in T)
AM.Move(D)
// NOTE: Commenting this out to avoid recreating mass driver glitch
/*
spawn(0)
AM.throw_at(E, 1, 1)
return
*/
if(istype(T, /turf/simulated))
del(T)
for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area...
bug.gib()
for(var/mob/living/simple_animal/pest in end_location) // And for the other kind of bug...
pest.gib()
start_location.move_contents_to(end_location)
settimeleft(SHUTTLELEAVETIME)
//send2irc("Server", "The Emergency Shuttle has docked with the station.")
captain_announce("The Emergency Shuttle has docked with the station. You have [round(timeleft()/60,1)] minutes to board the Emergency Shuttle.")
world << sound('sound/AI/shuttledock.ogg')
return 1
if(1)
// Just before it leaves, close the damn doors!
if(timeleft == 2 || timeleft == 1)
var/area/start_location = locate(/area/shuttle/escape/station)
for(var/obj/machinery/door/unpowered/shuttle/D in start_location)
spawn(0)
D.close()
D.locked = 1
if(timeleft>0)
return 0
/* --- Shuttle leaves the station, enters transit --- */
else
// Turn on the star effects
/* // kinda buggy atm, i'll fix this later
for(var/obj/effect/starspawner/S in world)
if(!S.spawning)
spawn() S.startspawn()
// hey you, get out of the way!
for(var/turf/T in dstturfs)
// find the turf to move things to
var/turf/D = locate(T.x, throwy - 1, 1)
//var/turf/E = get_step(D, SOUTH)
for(var/atom/movable/AM as mob|obj in T)
AM.Move(D)
// NOTE: Commenting this out to avoid recreating mass driver glitch
/*
spawn(0)
AM.throw_at(E, 1, 1)
return
*/
departed = 1 // It's going!
location = 0 // in deep space
direction = 2 // heading to centcom
if(istype(T, /turf/simulated))
del(T)
//main shuttle
var/area/start_location = locate(/area/shuttle/escape/station)
var/area/end_location = locate(/area/shuttle/escape/transit)
for(var/mob/living/carbon/bug in end_location) // If someone somehow is still in the shuttle's docking area...
bug.gib()
settimeleft(SHUTTLETRANSITTIME)
start_location.move_contents_to(end_location, null, NORTH)
for(var/mob/living/simple_animal/pest in end_location) // And for the other kind of bug...
pest.gib()
start_location.move_contents_to(end_location)
settimeleft(SHUTTLELEAVETIME)
//send2irc("Server", "The Emergency Shuttle has docked with the station.")
captain_announce("The Emergency Shuttle has docked with the station. You have [round(timeleft()/60,1)] minutes to board the Emergency Shuttle.")
world << sound('sound/AI/shuttledock.ogg')
return 1
if(1)
// Just before it leaves, close the damn doors!
if(timeleft == 2 || timeleft == 1)
var/area/start_location = locate(/area/shuttle/escape/station)
for(var/obj/machinery/door/unpowered/shuttle/D in start_location)
spawn(0)
D.close()
D.locked = 1
if(timeleft>0)
return 0
/* --- Shuttle leaves the station, enters transit --- */
else
// Turn on the star effects
/* // kinda buggy atm, i'll fix this later
for(var/obj/effect/starspawner/S in world)
if(!S.spawning)
spawn() S.startspawn()
*/
departed = 1 // It's going!
location = 0 // in deep space
direction = 2 // heading to centcom
//main shuttle
var/area/start_location = locate(/area/shuttle/escape/station)
var/area/end_location = locate(/area/shuttle/escape/transit)
settimeleft(SHUTTLETRANSITTIME)
start_location.move_contents_to(end_location, null, NORTH)
// Close shuttle doors, lock
for(var/obj/machinery/door/unpowered/shuttle/D in end_location)
spawn(0)
D.close()
D.locked = 1
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
// Some aesthetic turbulance shaking
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
//pods
start_location = locate(/area/shuttle/escape_pod1/station)
end_location = locate(/area/shuttle/escape_pod1/transit)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
//pods
start_location = locate(/area/shuttle/escape_pod1/station)
end_location = locate(/area/shuttle/escape_pod1/transit)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
start_location = locate(/area/shuttle/escape_pod2/station)
end_location = locate(/area/shuttle/escape_pod2/transit)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
start_location = locate(/area/shuttle/escape_pod2/station)
end_location = locate(/area/shuttle/escape_pod2/transit)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
start_location = locate(/area/shuttle/escape_pod3/station)
end_location = locate(/area/shuttle/escape_pod3/transit)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
start_location = locate(/area/shuttle/escape_pod3/station)
end_location = locate(/area/shuttle/escape_pod3/transit)
start_location.move_contents_to(end_location, null, NORTH)
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
start_location = locate(/area/shuttle/escape_pod5/station)
end_location = locate(/area/shuttle/escape_pod5/transit)
start_location.move_contents_to(end_location, null, EAST)
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
start_location = locate(/area/shuttle/escape_pod5/station)
end_location = locate(/area/shuttle/escape_pod5/transit)
start_location.move_contents_to(end_location, null, EAST)
for(var/obj/machinery/door/D in end_location)
spawn(0)
D.close()
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
for(var/mob/M in end_location)
if(M.client)
spawn(0)
if(M.buckled)
shake_camera(M, 4, 1) // buckled, not a lot of shaking
else
shake_camera(M, 10, 2) // unbuckled, HOLY SHIT SHAKE THE ROOM
if(istype(M, /mob/living/carbon))
if(!M.buckled)
M.Weaken(5)
captain_announce("The Emergency Shuttle has left the station. Estimate [round(timeleft()/60,1)] minutes until the shuttle docks at Central Command.")
captain_announce("The Emergency Shuttle has left the station. Estimate [round(timeleft()/60,1)] minutes until the shuttle docks at Central Command.")
return 1
return 1
else
return 1
else
return 1
/*
@@ -434,23 +435,23 @@ datum/shuttle_controller
var/direction = SOUTH
layer = 2 // TURF_LAYER
New()
..()
pixel_x += rand(-2,30)
pixel_y += rand(-2,30)
var/starnum = pick("1", "1", "1", "2", "3", "4")
/obj/effect/bgstar/New()
..()
pixel_x += rand(-2,30)
pixel_y += rand(-2,30)
var/starnum = pick("1", "1", "1", "2", "3", "4")
icon_state = "star"+starnum
icon_state = "star"+starnum
speed = rand(2, 5)
speed = rand(2, 5)
proc/startmove()
/obj/effect/bgstar/proc/startmove()
while(src)
sleep(speed)
step(src, direction)
for(var/obj/effect/starender/E in loc)
del(src)
while(src)
sleep(speed)
step(src, direction)
for(var/obj/effect/starender/E in loc)
del(src)
/obj/effect/starender
@@ -461,16 +462,16 @@ datum/shuttle_controller
var/spawndir = SOUTH
var/spawning = 0
West
spawndir = WEST
/obj/effect/starspawner/West
spawndir = WEST
proc/startspawn()
spawning = 1
while(spawning)
sleep(rand(2, 30))
var/obj/effect/bgstar/S = new/obj/effect/bgstar(locate(x,y,z))
S.direction = spawndir
spawn()
S.startmove()
/obj/effect/starspawner/proc/startspawn()
spawning = 1
while(spawning)
sleep(rand(2, 30))
var/obj/effect/bgstar/S = new/obj/effect/bgstar(locate(x,y,z))
S.direction = spawndir
spawn()
S.startmove()

View File

@@ -58,6 +58,10 @@
G.fields["sex"] = H.gender
G.fields["species"] = H.get_species()
G.fields["photo"] = get_id_photo(H)
if(H.gen_record && !jobban_isbanned(H, "Records"))
G.fields["notes"] = H.gen_record
else
G.fields["notes"] = "No notes found."
general += G
//Medical Record
@@ -119,20 +123,7 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
if (H.gender == FEMALE)
g = "f"
var/icon/icobase
switch(H.get_species())
if("Tajaran")
icobase = 'icons/mob/human_races/r_tajaran.dmi'
if("Unathi")
icobase = 'icons/mob/human_races/r_lizard.dmi'
if("Skrell")
icobase = 'icons/mob/human_races/r_skrell.dmi'
if("Vox")
icobase = 'icons/mob/human_races/r_vox.dmi'
else
icobase = 'icons/mob/human_races/r_human.dmi'
var/icon/icobase = H.species.icobase
preview_icon = new /icon(icobase, "torso_[g]")
var/icon/temp
@@ -149,15 +140,13 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
preview_icon.Blend(temp, ICON_OVERLAY)
// Skin tone
if(H.get_species() == "Human")
if(H.species.flags & HAS_SKIN_TONE)
if (H.s_tone >= 0)
preview_icon.Blend(rgb(H.s_tone, H.s_tone, H.s_tone), ICON_ADD)
else
preview_icon.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT)
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes_s")
if(H.get_species()=="Vox")
eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "vox_eyes_s")
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.species ? H.species.eyes : "eyes_s")
eyes_s.Blend(rgb(H.r_eyes, H.g_eyes, H.b_eyes), ICON_ADD)

View File

@@ -256,9 +256,12 @@ client
body += "<option value='?_src_=vars;drop_everything=\ref[D]'>Drop Everything</option>"
body += "<option value='?_src_=vars;regenerateicons=\ref[D]'>Regenerate Icons</option>"
body += "<option value='?_src_=vars;addlanguage=\ref[D]'>Add Language</option>"
body += "<option value='?_src_=vars;remlanguage=\ref[D]'>Remove Language</option>"
if(ishuman(D))
body += "<option value>---</option>"
body += "<option value='?_src_=vars;setmutantrace=\ref[D]'>Set Mutantrace</option>"
body += "<option value='?_src_=vars;setspecies=\ref[D]'>Set Species</option>"
body += "<option value='?_src_=vars;makeai=\ref[D]'>Make AI</option>"
body += "<option value='?_src_=vars;makerobot=\ref[D]'>Make cyborg</option>"
body += "<option value='?_src_=vars;makemonkey=\ref[D]'>Make monkey</option>"
@@ -743,6 +746,67 @@ client
H.dna.mutantrace = new_mutantrace
H.update_mutantrace()
else if(href_list["setspecies"])
if(!check_rights(R_SPAWN)) return
var/mob/living/carbon/human/H = locate(href_list["setspecies"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
var/new_species = input("Please choose a new species.","Species",null) as null|anything in all_species
if(!H)
usr << "Mob doesn't exist anymore"
return
if(H.set_species(new_species))
usr << "Set species of [H] to [H.species]."
else
usr << "Failed! Something went wrong."
else if(href_list["addlanguage"])
if(!check_rights(R_SPAWN)) return
var/mob/H = locate(href_list["addlanguage"])
if(!istype(H))
usr << "This can only be done to instances of type /mob"
return
var/new_language = input("Please choose a language to add.","Language",null) as null|anything in all_languages
if(!H)
usr << "Mob doesn't exist anymore"
return
if(H.add_language(new_language))
usr << "Added [new_language] to [H]."
else
usr << "Mob already knows that language."
else if(href_list["remlanguage"])
if(!check_rights(R_SPAWN)) return
var/mob/H = locate(href_list["remlanguage"])
if(!istype(H))
usr << "This can only be done to instances of type /mob"
return
if(!H.languages.len)
usr << "This mob knows no languages."
return
var/datum/language/rem_language = input("Please choose a language to remove.","Language",null) as null|anything in H.languages
if(!H)
usr << "Mob doesn't exist anymore"
return
if(H.remove_language(rem_language.name))
usr << "Removed [rem_language] from [H]."
else
usr << "Mob doesn't know that language."
else if(href_list["regenerateicons"])
if(!check_rights(0)) return

View File

@@ -356,10 +356,12 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/storage/firstaid/fire,
/obj/item/weapon/storage/firstaid/toxin,
/obj/item/weapon/storage/firstaid/o2,
/obj/item/weapon/storage/firstaid/adv,
/obj/item/weapon/reagent_containers/glass/bottle/antitoxin,
/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,
/obj/item/weapon/reagent_containers/glass/bottle/stoxin,
/obj/item/weapon/storage/box/syringes)
/obj/item/weapon/storage/box/syringes,
/obj/item/weapon/storage/box/autoinjectors)
cost = 10
containertype = /obj/structure/closet/crate/medical
containername = "Medical crate"

View File

@@ -81,30 +81,6 @@
plant_type = 2
growthstages = 3
/obj/item/seeds/replicapod
name = "pack of replica pod seeds"
desc = "These seeds grow into replica pods. They say these are used to harvest humans."
icon_state = "seed-replicapod"
mypath = "/obj/item/seeds/replicapod"
species = "replicapod"
plantname = "Replica Pod"
productname = "/mob/living/carbon/human" //verrry special -- Urist
lifespan = 50 //no idea what those do
endurance = 8
maturation = 10
production = 10
yield = 1 //seeds if there isn't a dna inside
oneharvest = 1
potency = 30
plant_type = 0
growthstages = 6
var/ui = null //for storing the guy
var/se = null
var/ckey = null
var/realName = null
var/datum/mind/mind = null
gender = MALE
/obj/item/seeds/grapeseed
name = "pack of grape seeds"
desc = "These seeds grow into grape vines."

View File

@@ -557,6 +557,13 @@
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
/obj/item/weapon/hatchet/unathiknife
name = "duelling knife"
desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude."
icon = 'icons/obj/weapons.dmi'
icon_state = "unathiknife"
attack_verb = list("ripped", "torn", "cut")
/obj/item/weapon/scythe
icon_state = "scythe0"
name = "scythe"

View File

@@ -309,6 +309,11 @@ proc/process_ghost_teleport_locs()
/area/shuttle/research/outpost
icon_state = "shuttle"
/area/shuttle/vox/station
name = "\improper Vox Skipjack"
icon_state = "yellow"
requires_power = 0
/area/airtunnel1/ // referenced in airtunnel.dm:759
/area/dummy/ // Referenced in engine.dm:261
@@ -489,10 +494,29 @@ proc/process_ghost_teleport_locs()
icon_state = "yellow"
requires_power = 0
/area/vox_station/transit
name = "\improper hyperspace"
icon_state = "shuttle"
/area/vox_station/southwest_solars
name = "\improper aft port solars"
icon_state = "southwest"
/area/vox_station/northwest_solars
name = "\improper fore port solars"
icon_state = "northwest"
/area/vox_station/northeast_solars
name = "\improper fore starboard solars"
icon_state = "northeast"
/area/vox_station/southeast_solars
name = "\improper aft starboard solars"
icon_state = "southeast"
/area/vox_station/mining
name = "\improper nearby mining asteroid"
icon_state = "north"
//PRISON
/area/prison

View File

@@ -45,8 +45,13 @@
poweralm = state
if(istype(source)) //Only report power alarms on the z-level where the source is located.
var/list/cameras = list()
for (var/obj/machinery/camera/C in src)
cameras += C
for (var/area/RA in related)
for (var/obj/machinery/camera/C in RA)
cameras += C
if(state == 1)
C.network.Remove("Power Alarms")
else
C.network.Add("Power Alarms")
for (var/mob/living/silicon/aiPlayer in player_list)
if(aiPlayer.z == source.z)
if (state == 1)
@@ -73,11 +78,15 @@
//updateicon()
for(var/obj/machinery/camera/C in RA)
cameras += C
C.network.Add("Atmosphere Alarms")
for(var/mob/living/silicon/aiPlayer in player_list)
aiPlayer.triggerAlarm("Atmosphere", src, cameras, src)
for(var/obj/machinery/computer/station_alert/a in machines)
a.triggerAlarm("Atmosphere", src, cameras, src)
else if (atmosalm == 2)
for(var/area/RA in related)
for(var/obj/machinery/camera/C in RA)
C.network.Remove("Atmosphere Alarms")
for(var/mob/living/silicon/aiPlayer in player_list)
aiPlayer.cancelAlarm("Atmosphere", src, src)
for(var/obj/machinery/computer/station_alert/a in machines)
@@ -101,8 +110,10 @@
spawn()
D.close()
var/list/cameras = list()
for (var/obj/machinery/camera/C in src)
cameras += C
for(var/area/RA in related)
for (var/obj/machinery/camera/C in RA)
cameras.Add(C)
C.network.Add("Fire Alarms")
for (var/mob/living/silicon/ai/aiPlayer in player_list)
aiPlayer.triggerAlarm("Fire", src, cameras, src)
for (var/obj/machinery/computer/station_alert/a in machines)
@@ -120,6 +131,9 @@
else if(D.density)
spawn(0)
D.open()
for(var/area/RA in related)
for (var/obj/machinery/camera/C in RA)
C.network.Remove("Fire Alarms")
for (var/mob/living/silicon/ai/aiPlayer in player_list)
aiPlayer.cancelAlarm("Fire", src, src)
for (var/obj/machinery/computer/station_alert/a in machines)

View File

@@ -490,7 +490,7 @@ its easier to just keep the beam vertical.
var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblClickNew() proc is being tested)
/atom/proc/DblClickNew()
/*/atom/proc/DblClickNew()
if(!usr) return
// TODO DOOHL: Intergrate params to new proc. Saved for another time because var/valid_place is a fucking brainfuck
@@ -792,7 +792,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
if (in_range)
if ( !animal.restrained() )
attack_animal(animal)
attack_animal(animal)*/
/atom/DblClick(location, control, params) //TODO: DEFERRED: REWRITE
if(!usr) return
@@ -943,9 +943,9 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
// ------- ( CAN USE ITEM OR HAS 1 SECOND USE DELAY ) AND NOT CLICKING ON SCREEN -------
if (usr.next_move < world.time)
usr.prev_move = usr.next_move
usr.next_move = world.time + 10
if (usr.last_click + usr.click_delay < world.time)
usr.last_click = world.time
usr.click_delay = 0
else
// ------- ALREADY USED ONE ITEM WITH USE DELAY IN THE PREVIOUS SECOND -------
return
@@ -1109,10 +1109,9 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
// ------- ITEM INACESSIBLE OR CLICKING ON SCREEN -------
if (istype(src, /obj/screen))
// ------- IT'S THE HUD YOU'RE CLICKING ON -------
usr.prev_move = usr.next_move
usr:lastDblClick = world.time + 2
if (usr.next_move < world.time)
usr.next_move = world.time + 2
usr.delay_click(2)
if (usr.last_click + usr.click_delay < world.time)
usr.last_click = world.time
else
return
@@ -1144,7 +1143,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
src.hand_al(usr, usr.hand)
else
// ------- YOU ARE CLICKING ON AN OBJECT THAT'S INACCESSIBLE TO YOU AND IS NOT YOUR HUD -------
if((LASER in usr:mutations) && usr:a_intent == "hurt" && world.time >= usr.next_move)
if((LASER in usr:mutations) && usr:a_intent == "hurt" && usr.last_click + usr.click_delay < world.time)
// ------- YOU HAVE THE LASER MUTATION, YOUR INTENT SET TO HURT AND IT'S BEEN MORE THAN A DECISECOND SINCE YOU LAS TATTACKED -------
var/turf/T = get_turf(usr)
@@ -1169,7 +1168,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
spawn( 1 )
A.process()
usr.next_move = world.time + 6
usr.delay_click(6)
return
/atom/proc/ShiftClick(var/mob/M as mob)

View File

@@ -74,7 +74,6 @@ Radio:
1359 - Security
1441 - death squad
1443 - Confession Intercom
1349 - Miners
1347 - Cargo techs
Devices:
@@ -110,10 +109,21 @@ var/list/radiochannels = list(
"Supply" = 1347,
)
//depenging helpers
var/list/DEPT_FREQS = list(1351,1355,1357,1359,1213, 1443, 1441,1347)
var/list/DEPT_FREQS = list(1351, 1355, 1357, 1359, 1213, 1443, 1441, 1347)
// central command channels, i.e deathsquid & response teams
var/list/CENT_FREQS = list(1441, 1443)
var/const/COMM_FREQ = 1353 //command, colored gold in chat window
var/const/SYND_FREQ = 1213
// department channels
var/const/SEC_FREQ = 1359
var/const/ENG_FREQ = 1357
var/const/SCI_FREQ = 1351
var/const/MED_FREQ = 1355
var/const/SUP_FREQ = 1347
#define TRANSMISSION_WIRE 0
#define TRANSMISSION_RADIO 1

View File

@@ -550,15 +550,11 @@
var/mob/living/carbon/monkey/O = null
switch(M.dna.mutantrace)
if("tajaran")
O = new /mob/living/carbon/monkey/tajara(src)
if("lizard")
O = new /mob/living/carbon/monkey/unathi(src)
if("skrell")
O = new /mob/living/carbon/monkey/skrell(src)
else
O = new /mob/living/carbon/monkey(src)
if(H.species.primitive)
O = new H.species.primitive(src)
else
H.gib() //Trying to change the species of a creature with no primitive var set is messy.
return
if(M)
if (M.dna)
@@ -626,6 +622,9 @@
del(animation)
var/mob/living/carbon/human/O = new( src )
if(Mo.greaterform)
O.set_species(Mo.greaterform)
if (isblockon(getblock(M.dna.uni_identity, 11,3),11))
O.gender = FEMALE
else

View File

@@ -6,7 +6,7 @@ var/list/blob_cores = list()
var/list/blob_nodes = list()
/datum/game_mode/blob
/*/datum/game_mode/blob
name = "blob"
config_tag = "blob"
required_players = 0
@@ -130,3 +130,4 @@ var/list/blob_nodes = list()
stage = 3
return
*/

View File

@@ -278,6 +278,7 @@ Implants;
if(BE_REV) roletext="revolutionary"
if(BE_CULTIST) roletext="cultist"
if(BE_NINJA) roletext="ninja"
if(BE_RAIDER) roletext="raider"
// Assemble a list of active players without jobbans.
for(var/mob/new_player/player in player_list)

View File

@@ -0,0 +1,257 @@
/*
VOX HEIST ROUNDTYPE
*/
#define MAX_VOX_KILLS 10 //Number of kills during the round before the Inviolate is broken.
//Would be nice to use vox-specific kills but is currently not feasible.
var/global/vox_kills = 0 //Used to check the Inviolate.
/datum/game_mode/
var/list/datum/mind/raiders = list() //Antags.
/datum/game_mode/heist
name = "heist"
config_tag = "heist"
required_players = 15
required_players_secret = 25
required_enemies = 4
recommended_enemies = 6
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/list/raid_objectives = list() //Raid objectives.
var/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective.
/datum/game_mode/heist/announce()
world << "<B>The current game mode is - Heist!</B>"
world << "<B>An unidentified bluespace signature has slipped past the Icarus and is approaching [station_name()]!</B>"
world << "Whoever they are, they're likely up to no good. Protect the crew and station resources against this dastardly threat!"
world << "<B>Raiders:</B> Loot [station_name()] for anything and everything you need."
world << "<B>Personnel:</B> Repel the raiders and their low, low prices and/or crossbows."
/datum/game_mode/heist/can_start()
if(!..())
return 0
var/list/candidates = get_players_for_role(BE_RAIDER)
var/raider_num = 0
//Check that we have enough vox.
if(candidates.len < required_enemies)
return 0
else if(candidates.len < recommended_enemies)
raider_num = candidates.len
else
raider_num = recommended_enemies
//Grab candidates randomly until we have enough.
while(raider_num > 0)
var/datum/mind/new_raider = pick(candidates)
raiders += new_raider
candidates -= new_raider
raider_num--
for(var/datum/mind/raider in raiders)
raider.assigned_role = "MODE"
raider.special_role = "Vox Raider"
return 1
/datum/game_mode/heist/pre_setup()
return 1
/datum/game_mode/heist/post_setup()
//Build a list of spawn points.
var/list/turf/raider_spawn = list()
for(var/obj/effect/landmark/L in landmarks_list)
if(L.name == "voxstart")
raider_spawn += get_turf(L)
del(L)
continue
//Generate objectives for the group.
raid_objectives = forge_vox_objectives()
var/index = 1
//Spawn the vox!
for(var/datum/mind/raider in raiders)
if(index > raider_spawn.len)
index = 1
raider.current.loc = raider_spawn[index]
index++
var/sounds = rand(2,8)
var/i = 0
var/newname = ""
while(i<=sounds)
i++
newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah"))
var/mob/living/carbon/human/vox = raider.current
vox.real_name = capitalize(newname)
vox.name = vox.real_name
vox.age = rand(12,20)
vox.dna.mutantrace = "vox"
vox.set_species("Vox")
vox.add_language("Vox-pidgin")
vox.h_style = "Short Vox Quills"
vox.flavor_text = ""
for(var/datum/organ/external/limb in vox.organs)
limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
vox.equip_vox_raider()
vox.regenerate_icons()
raider.objectives = raid_objectives
greet_vox(raider)
spawn (rand(waittime_l, waittime_h))
send_intercept()
/datum/game_mode/heist/proc/is_raider_crew_safe()
if(cortical_stacks.len == 0)
return 0
for(var/obj/stack in cortical_stacks)
if (get_area(stack) != locate(/area/shuttle/vox/station))
return 0
return 1
/datum/game_mode/heist/proc/is_raider_crew_alive()
for(var/datum/mind/raider in raiders)
if(raider.current)
if(istype(raider.current,/mob/living/carbon/human) && raider.current.stat != 2)
return 1
return 0
/datum/game_mode/heist/proc/forge_vox_objectives()
//Commented out for testing.
/* var/i = 1
var/max_objectives = pick(2,2,2,3,3)
var/list/objs = list()
while(i<= max_objectives)
var/list/goals = list("kidnap","loot","salvage")
var/goal = pick(goals)
var/datum/objective/heist/O
if(goal == "kidnap")
goals -= "kidnap"
O = new /datum/objective/heist/kidnap()
else if(goal == "loot")
O = new /datum/objective/heist/loot()
else
O = new /datum/objective/heist/salvage()
O.choose_target()
objs += O
i++
//-All- vox raids have these two objectives. Failing them loses the game.
objs += new /datum/objective/heist/inviolate_crew
objs += new /datum/objective/heist/inviolate_death */
raid_objectives += new /datum/objective/heist/kidnap
raid_objectives += new /datum/objective/heist/loot
raid_objectives += new /datum/objective/heist/salvage
raid_objectives += new /datum/objective/heist/inviolate_crew
raid_objectives += new /datum/objective/heist/inviolate_death
for(var/datum/objective/heist/O in raid_objectives)
O.choose_target()
return raid_objectives
/datum/game_mode/heist/proc/greet_vox(var/datum/mind/raider)
raider.current << "\blue <B>You are a Vox Raider, fresh from the Shoal!</b>"
raider.current << "\blue The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to Tau Ceti and much of the unexplored galaxy. You and the crew have come to the Exodus for plunder, trade or both."
raider.current << "\blue Vox are cowardly and will flee from larger groups, but corner one or find them en masse and they are vicious."
raider.current << "\blue Use :V to voxtalk, :H to talk on your encrypted channel, and don't forget to turn on your nitrogen internals!"
var/obj_count = 1
for(var/datum/objective/objective in raider.objectives)
raider.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
/datum/game_mode/heist/declare_completion()
//No objectives, go straight to the feedback.
if(!(raid_objectives.len)) return ..()
var/win_type = "Major"
var/win_group = "Crew"
var/win_msg = ""
var/success = raid_objectives.len
//Decrease success for failed objectives.
for(var/datum/objective/O in raid_objectives)
if(!(O.check_completion())) success--
//Set result by objectives.
if(success == raid_objectives.len)
win_type = "Major"
win_group = "Vox"
else if(success > 2)
win_type = "Minor"
win_group = "Vox"
else
win_type = "Minor"
win_group = "Crew"
//Now we modify that result by the state of the vox crew.
if(!is_raider_crew_alive())
win_type = "Major"
win_group = "Crew"
win_msg += "<B>The Vox Raiders have been wiped out!</B>"
else if(!is_raider_crew_safe())
if(win_group == "Crew" && win_type == "Minor")
win_type = "Major"
win_group = "Crew"
win_msg += "<B>The Vox Raiders have left someone behind!</B>"
else
if(win_group == "Vox")
if(win_type == "Minor")
win_type = "Major"
win_msg += "<B>The Vox Raiders escaped the station!</B>"
else
win_msg += "<B>The Vox Raiders were repelled!</B>"
world << "\red <FONT size = 3><B>[win_type] [win_group] victory!</B></FONT>"
world << "[win_msg]"
feedback_set_details("round_end_result","heist - [win_type] [win_group]")
var/count = 1
for(var/datum/objective/objective in raid_objectives)
if(objective.check_completion())
world << "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font>"
feedback_add_details("traitor_objective","[objective.type]|SUCCESS")
else
world << "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font>"
feedback_add_details("traitor_objective","[objective.type]|FAIL")
count++
..()
/datum/game_mode/heist/check_finished()
if (!(is_raider_crew_alive()) || (vox_shuttle_location && (vox_shuttle_location == "start")))
return 1
return ..()

View File

@@ -742,3 +742,173 @@ datum/objective/absorb
/*-------ENDOF CULTIST------*/
*/
//Vox heist objectives.
datum/objective/heist
proc/choose_target()
return
datum/objective/heist/kidnap
choose_target()
var/list/roles = list("Chief Engineer","Research Director","Roboticist","Chemist","Station Engineer")
var/list/possible_targets = list()
var/list/priority_targets = list()
for(var/datum/mind/possible_target in ticker.minds)
if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && (possible_target.assigned_role != "MODE"))
possible_targets += possible_target
for(var/role in roles)
if(possible_target.assigned_role == role)
priority_targets += possible_target
continue
if(priority_targets.len > 0)
target = pick(priority_targets)
else if(possible_targets.len > 0)
target = pick(possible_targets)
if(target && target.current)
explanation_text = "The Shoal has a need for [target.current.real_name], the [target.assigned_role]. Take them alive."
else
explanation_text = "Free Objective"
return target
check_completion()
if(target && target.current)
if (target.current.stat == 2)
return 0 // They're dead. Fail.
//if (!target.current.restrained())
// return 0 // They're loose. Close but no cigar.
var/area/shuttle/vox/station/A = locate()
for(var/mob/living/carbon/human/M in A)
if(target.current == M)
return 1 //They're restrained on the shuttle. Success.
else
return 0
datum/objective/heist/loot
choose_target()
var/loot = "an object"
switch(rand(1,8))
if(1)
target = /obj/structure/particle_accelerator
target_amount = 6
loot = "a complete particle accelerator"
if(2)
target = /obj/machinery/the_singularitygen
target_amount = 1
loot = "a gravitational generator"
if(3)
target = /obj/machinery/power/emitter
target_amount = 4
loot = "four emitters"
if(4)
target = /obj/machinery/nuclearbomb
target_amount = 1
loot = "a nuclear bomb"
if(5)
target = /obj/item/weapon/gun
target_amount = 6
loot = "six guns"
if(6)
target = /obj/item/weapon/gun/energy
target_amount = 4
loot = "four energy guns"
if(7)
target = /obj/item/weapon/gun/energy/laser
target_amount = 2
loot = "two laser guns"
if(8)
target = /obj/item/weapon/gun/energy/ionrifle
target_amount = 1
loot = "an ion gun"
explanation_text = "We are lacking in hardware. Steal [loot]."
check_completion()
var/total_amount = 0
for(var/obj/O in locate(/area/shuttle/vox/station))
if(istype(O,target)) total_amount++
if(total_amount >= target_amount) return 1
var/datum/game_mode/heist/H = ticker.mode
for(var/datum/mind/raider in H.raiders)
if(raider.current)
for(var/obj/O in raider.current.get_contents())
if(istype(O,target)) total_amount++
if(total_amount >= target_amount) return 1
return 0
datum/objective/heist/salvage
choose_target()
switch(rand(1,8))
if(1)
target = "metal"
target_amount = 300
if(2)
target = "glass"
target_amount = 200
if(3)
target = "plasteel"
target_amount = 100
if(4)
target = "plasma"
target_amount = 100
if(5)
target = "silver"
target_amount = 50
if(6)
target = "gold"
target_amount = 20
if(7)
target = "uranium"
target_amount = 20
if(8)
target = "diamond"
target_amount = 20
explanation_text = "Ransack the station and escape with [target_amount] [target]."
check_completion()
var/total_amount = 0
for(var/obj/item/O in locate(/area/shuttle/vox/station))
if(istype(O,/obj/item/stack/sheet))
if(O.name == target)
var/obj/item/stack/sheet/S = O
total_amount += S.amount
var/datum/game_mode/heist/H = ticker.mode
for(var/datum/mind/raider in H.raiders)
if(raider.current)
for(var/obj/item/O in raider.current.get_contents())
if(istype(O,/obj/item/stack/sheet))
if(O.name == target)
var/obj/item/stack/sheet/S = O
total_amount += S.amount
if(total_amount >= target_amount) return 1
return 0
datum/objective/heist/inviolate_crew
explanation_text = "Do not leave any Vox behind, alive or dead."
check_completion()
var/datum/game_mode/heist/H = ticker.mode
if(H.is_raider_crew_safe()) return 1
return 0
datum/objective/heist/inviolate_death
explanation_text = "Follow the Inviolate. Minimise death and loss of resources."
check_completion()
if(vox_kills>5) return 0
return 1

View File

@@ -28,7 +28,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/cmo(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
@@ -88,7 +88,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)

View File

@@ -70,12 +70,14 @@
dat += text("[]\t-Burn Severity %: []</FONT><BR>", (occupant.getFireLoss() < 60 ? "<font color='blue'>" : "<font color='red'>"), occupant.getFireLoss())
dat += text("<HR>Paralysis Summary %: [] ([] seconds left!)<BR>", occupant.paralysis, round(occupant.paralysis / 4))
if(occupant.reagents)
dat += text("Inaprovaline units: [] units<BR>", occupant.reagents.get_reagent_amount("inaprovaline"))
dat += text("Soporific: [] units<BR>", occupant.reagents.get_reagent_amount("stoxin"))
dat += text("Dermaline: [] units<BR>", occupant.reagents.get_reagent_amount("dermaline"))
dat += text("Bicaridine: [] units<BR>", occupant.reagents.get_reagent_amount("bicaridine"))
dat += text("Dexalin: [] units<BR>", occupant.reagents.get_reagent_amount("dexalin"))
dat += text("<HR><A href='?src=\ref[];refresh=1'>Refresh meter readings each second</A><BR><A href='?src=\ref[];inap=1'>Inject Inaprovaline</A><BR><A href='?src=\ref[];stox=1'>Inject Soporific</A><BR><A href='?src=\ref[];derm=1'>Inject Dermaline</A><BR><A href='?src=\ref[];bic=1'>Inject Bicaridine</A><BR><A href='?src=\ref[];dex=1'>Inject Dexalin</A>", src, src, src, src, src, src)
for(var/chemical in connected.available_chemicals)
dat += "[connected.available_chemicals[chemical]]: [occupant.reagents.get_reagent_amount(chemical)] units<br>"
dat += "<HR><A href='?src=\ref[src];refresh=1'>Refresh meter readings each second</A><BR>"
for(var/chemical in connected.available_chemicals)
dat += "Inject [connected.available_chemicals[chemical]]: "
for(var/amount in connected.amounts)
dat += "<a href ='?src=\ref[src];chemical=[chemical];amount=[amount]'>[amount] units</a> "
dat += "<br>"
else
dat += "The sleeper is empty."
dat += text("<BR><BR><A href='?src=\ref[];mach_close=sleeper'>Close</A>", user)
@@ -88,27 +90,15 @@
return
if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
usr.set_machine(src)
if (src.connected)
if (src.connected.occupant)
if(src.connected.occupant.health > 0)
if (href_list["inap"])
src.connected.inject_inap(usr)
if (href_list["stox"])
src.connected.inject_stox(usr)
if (href_list["derm"])
src.connected.inject_dermaline(usr)
if (href_list["bic"])
src.connected.inject_bicaridine(usr)
if (href_list["dex"])
src.connected.inject_dexalin(usr)
else
if(src.connected.occupant.health > -100)
if (href_list["inap"])
src.connected.inject_inap(usr)
if (href_list["stox"] || href_list["derm"] || href_list["bic"] || href_list["dex"])
usr << "\red \b this person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!"
else
if (href_list["chemical"])
if (src.connected)
if (src.connected.occupant)
if (src.connected.occupant.stat == DEAD)
usr << "\red \b This person has no life for to preserve anymore. Take them to a department capable of reanimating them."
else if(src.connected.occupant.health > 0 || href_list["chemical"] == "inaprovaline")
src.connected.inject_chemical(usr,href_list["chemical"],text2num(href_list["amount"]))
else
usr << "\red \b This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!"
if (href_list["refresh"])
src.updateUsrDialog()
src.add_fingerprint(usr)
@@ -142,6 +132,8 @@
anchored = 1
var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r"
var/mob/living/occupant = null
var/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "dermaline" = "Dermaline", "bicaridine" = "Bicaridine", "dexalin" = "Dexalin")
var/amounts = list(10, 20)
New()
@@ -275,53 +267,13 @@
return
proc/inject_inap(mob/living/user as mob)
proc/inject_chemical(mob/living/user as mob, chemical, amount)
if(src.occupant && src.occupant.reagents)
if(src.occupant.reagents.get_reagent_amount("inaprovaline") + 30 <= 60)
src.occupant.reagents.add_reagent("inaprovaline", 30)
user << text("Occupant now has [] units of Inaprovaline in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("inaprovaline"))
else
user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
return
proc/inject_stox(mob/living/user as mob)
if(src.occupant && src.occupant.reagents)
if(src.occupant.reagents.get_reagent_amount("stoxin") + 20 <= 40)
src.occupant.reagents.add_reagent("stoxin", 20)
user << text("Occupant now has [] units of soporifics in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("stoxin"))
else
user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
return
proc/inject_dermaline(mob/living/user as mob)
if(src.occupant && src.occupant.reagents)
if(src.occupant.reagents.get_reagent_amount("dermaline") + 20 <= 40)
src.occupant.reagents.add_reagent("dermaline", 20)
user << text("Occupant now has [] units of Dermaline in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("dermaline"))
else
user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
return
proc/inject_bicaridine(mob/living/user as mob)
if(src.occupant && src.occupant.reagents)
if(src.occupant.reagents.get_reagent_amount("bicaridine") + 10 <= 20)
src.occupant.reagents.add_reagent("bicaridine", 10)
user << text("Occupant now has [] units of Bicaridine in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("bicaridine"))
else
user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
return
proc/inject_dexalin(mob/living/user as mob)
if(src.occupant && src.occupant.reagents)
if(src.occupant.reagents.get_reagent_amount("dexalin") + 20 <= 40)
src.occupant.reagents.add_reagent("dexalin", 20)
user << text("Occupant now has [] units of Dexalin in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("dexalin"))
else
user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 40)
src.occupant.reagents.add_reagent(chemical, amount)
user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [available_chemicals[chemical]] in his/her bloodstream."
return
user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
return
@@ -398,4 +350,4 @@
del(O)
src.add_fingerprint(usr)
return
return
return

View File

@@ -1479,8 +1479,7 @@ FIRE ALARM
A = A.loc
if (!( istype(A, /area) ))
return
for(var/area/RA in A.related)
RA.firereset()
A.firereset()
update_icon()
return
@@ -1491,8 +1490,7 @@ FIRE ALARM
A = A.loc
if (!( istype(A, /area) ))
return
for(var/area/RA in A.related)
RA.firealert()
A.firealert()
update_icon()
//playsound(src.loc, 'sound/ambience/signal.ogg', 75, 0)
return

View File

@@ -233,7 +233,8 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
if(target && path.len == 0)
spawn(0)
if(!src || !target) return
src.path = AStar(src.loc, src.target.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, 0, 30)
src.path = AStar(src.loc, src.target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id=botcard)
if (!path) path = list()
if(src.path.len == 0)
src.oldtarget = src.target
src.target = null

View File

@@ -615,6 +615,7 @@ Auto Patrol: []"},
// given an optional turf to avoid
/obj/machinery/bot/ed209/proc/calc_path(var/turf/avoid = null)
src.path = AStar(src.loc, patrol_target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id=botcard, exclude=avoid)
if (!src.path) src.path = list()
// look for a criminal in view of the bot

View File

@@ -241,9 +241,10 @@
if(src.target && (src.target != null) && src.path.len == 0)
spawn(0)
if(!istype(src.target, /turf/))
src.path = AStar(src.loc, src.target.loc, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30)
src.path = AStar(src.loc, src.target.loc, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30, id=botcard)
else
src.path = AStar(src.loc, src.target, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30)
src.path = AStar(src.loc, src.target, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30, id=botcard)
if (!src.path) src.path = list()
if(src.path.len == 0)
src.oldtarget = src.target
src.target = null

View File

@@ -87,6 +87,9 @@
usr << "No network found please hang up and try your call again."
return
var/temptag = "[get_area(src)] ([rand(1, 999)])"
input = strip_html(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag))
state = 4
var/obj/machinery/camera/C = new(src.loc)
src.loc = C
@@ -94,9 +97,12 @@
C.auto_turn()
C.network = tempnetwork
C.network = uniquelist(tempnetwork)
tempnetwork = difflist(C.network,RESTRICTED_CAMERA_NETWORKS)
if(!tempnetwork.len)//Camera isn't on any open network - remove its chunk from AI visibility.
cameranet.removeCamera(C)
C.c_tag = "[get_area_name(src)] ([rand(1, 999)]"
C.c_tag = input
for(var/i = 5; i >= 0; i -= 1)
var/direct = input(user, "Direction?", "Assembling Camera", null) in list("LEAVE IT", "NORTH", "EAST", "SOUTH", "WEST" )

View File

@@ -116,7 +116,7 @@
//Clonepod
//Start growing a human clone in the pod!
/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/mrace)
/obj/machinery/clonepod/proc/growclone(var/ckey, var/clonename, var/ui, var/se, var/mindref, var/datum/species/mrace)
if(mess || attempting)
return 0
var/datum/mind/clonemind = locate(mindref)
@@ -191,13 +191,11 @@
randmutb(H) //Sometimes the clones come out wrong.
H.f_style = "Shaved"
if(mrace == "none") //no more xenos losing ears/tentacles
if(mrace.name == "Human") //no more xenos losing ears/tentacles
H.h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
if(H.dna)
H.dna.mutantrace = mrace
H.update_mutantrace()
H.update_mutantrace_languages()
H.species = mrace
H.update_mutantrace()
H.suiciding = 0
src.attempting = 0
return 1

View File

@@ -37,6 +37,10 @@
/obj/item/weapon/circuitboard/security
name = "Circuit board (Security)"
build_path = "/obj/machinery/computer/security"
var/network = list("SS13")
req_access = list(access_security)
var/locked = 1
var/emagged = 0
/obj/item/weapon/circuitboard/aicore
name = "Circuit board (AI core)"
origin_tech = "programming=4;biotech=2"
@@ -80,6 +84,9 @@
/obj/item/weapon/circuitboard/secure_data
name = "Circuit board (Security Records)"
build_path = "/obj/machinery/computer/secure_data"
/obj/item/weapon/circuitboard/skills
name = "Circuit board (Employment Records)"
build_path = "/obj/machinery/computer/skills"
/obj/item/weapon/circuitboard/stationalert
name = "Circuit board (Station Alerts)"
build_path = "/obj/machinery/computer/station_alert"
@@ -166,10 +173,6 @@
name = "Circuit board (Operating Computer)"
build_path = "/obj/machinery/computer/operating"
origin_tech = "programming=2;biotech=2"
/obj/item/weapon/circuitboard/mining
name = "Circuit board (Outpost Status Display)"
build_path = "/obj/machinery/computer/security/mining"
origin_tech = "programming=2"
/obj/item/weapon/circuitboard/comm_monitor
name = "Circuit board (Telecommunications Monitor)"
build_path = "/obj/machinery/computer/telecomms/monitor"
@@ -238,6 +241,40 @@
user << "DERP! BUG! Report this (And what you were doing to cause it) to Agouri"
return
/obj/item/weapon/circuitboard/security/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I,/obj/item/weapon/card/emag))
if(emagged)
user << "Circuit lock is already removed."
return
user << "\blue You override the circuit lock and open controls."
emagged = 1
locked = 0
else if(istype(I,/obj/item/weapon/card/id))
if(emagged)
user << "\red Circuit lock does not respond."
return
if(check_access(I))
locked = !locked
user << "\blue You [locked ? "" : "un"]lock the circuit controls."
else
user << "\red Access denied."
else if(istype(I,/obj/item/device/multitool))
if(locked)
user << "\red Circuit controls are locked."
return
var/existing_networks = dd_list2text(network,",")
var/input = strip_html(input(usr, "Which networks would you like to connect this camera console circuit to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Multitool-Circuitboard interface", existing_networks))
if(!input)
usr << "No input found please hang up and try your call again."
return
var/list/tempnetwork = text2list(input, ",")
tempnetwork = difflist(tempnetwork,RESTRICTED_CAMERA_NETWORKS,1)
if(tempnetwork.len < 1)
usr << "No network found please hang up and try your call again."
return
network = tempnetwork
return
/obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I,/obj/item/weapon/screwdriver))
if(src.build_path == "/obj/machinery/computer/rdconsole/core")
@@ -353,4 +390,8 @@
var/obj/machinery/computer/supplycomp/SC = B
var/obj/item/weapon/circuitboard/supplycomp/C = circuit
SC.can_order_contraband = C.contraband_enabled
del(src)
if(istype(circuit,/obj/item/weapon/circuitboard/security))
var/obj/machinery/computer/security/C = B
var/obj/item/weapon/circuitboard/security/CB = circuit
C.network = CB.network
del(src)

View File

@@ -5,7 +5,6 @@
name = "Security Cameras"
desc = "Used to access the various cameras on the station."
icon_state = "cameras"
circuit = "/obj/item/weapon/circuitboard/security"
var/obj/machinery/camera/current = null
var/last_pic = 1.0
var/list/network = list("SS13")
@@ -45,8 +44,7 @@
var/list/D = list()
D["Cancel"] = "Cancel"
for(var/obj/machinery/camera/C in L)
var/list/tempnetwork = C.network&network
if(tempnetwork.len)
if(can_access_camera(C))
D[text("[][]", C.c_tag, (C.status ? null : " (Deactivated)"))] = C
var/t = input(user, "Which camera should you change to?") as null|anything in D
@@ -61,24 +59,110 @@
return 0
if(C)
if ((get_dist(user, src) > 1 || user.machine != src || user.blinded || !( user.canmove ) || !( C.can_use() )) && (!istype(user, /mob/living/silicon/ai)))
if(!C.can_use() && !isAI(user))
src.current = null
return 0
else
if(isAI(user))
var/mob/living/silicon/ai/A = user
A.eyeobj.setLoc(get_turf(C))
A.client.eye = A.eyeobj
else
src.current = C
use_power(50)
spawn(5)
attack_hand(user)
switch_to_camera(user, C)
spawn(5)
attack_hand(user)
return
proc/can_access_camera(var/obj/machinery/camera/C)
var/list/shared_networks = src.network & C.network
if(shared_networks.len)
return 1
return 0
proc/switch_to_camera(var/mob/user, var/obj/machinery/camera/C)
if ((get_dist(user, src) > 1 || user.machine != src || user.blinded || !( user.canmove ) || !( C.can_use() )) && (!istype(user, /mob/living/silicon/ai)))
if(!C.can_use() && !isAI(user))
src.current = null
return 0
else
if(isAI(user))
var/mob/living/silicon/ai/A = user
A.eyeobj.setLoc(get_turf(C))
A.client.eye = A.eyeobj
else
src.current = C
use_power(50)
return 1
attackby(I as obj, user as mob)
if(istype(I, /obj/item/weapon/screwdriver))
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20))
if (stat & BROKEN)
user << "\blue The broken glass falls out."
var/obj/structure/computerframe/CF = new /obj/structure/computerframe(loc)
new /obj/item/weapon/shard(loc)
var/obj/item/weapon/circuitboard/security/CB = new /obj/item/weapon/circuitboard/security(CF)
CB.network = network
for (var/obj/C in src)
C.loc = loc
CF.circuit = CB
CF.state = 3
CF.icon_state = "3"
CF.anchored = 1
del(src)
else
user << "\blue You disconnect the monitor."
var/obj/structure/computerframe/CF = new /obj/structure/computerframe( loc )
var/obj/item/weapon/circuitboard/security/CB = new /obj/item/weapon/circuitboard/security(CF)
CB.network = network
for (var/obj/C in src)
C.loc = loc
CF.circuit = CB
CF.state = 4
CF.icon_state = "4"
CF.anchored = 1
del(src)
else
attack_hand(user)
return
//Camera control: moving.
proc/jump_on_click(var/mob/user,var/A)
if(user.machine != src)
return
var/obj/machinery/camera/jump_to
if(istype(A,/obj/machinery/camera))
jump_to = A
else if(ismob(A))
if(ishuman(A))
jump_to = locate() in A:head
else if(isrobot(A))
jump_to = A:camera
else if(isobj(A))
jump_to = locate() in A
else if(isturf(A))
var/best_dist = INFINITY
for(var/obj/machinery/camera/camera in get_area(A))
if(!camera.can_use())
continue
if(!can_access_camera(camera))
continue
var/dist = get_dist(camera,A)
if(dist < best_dist)
best_dist = dist
jump_to = camera
if(isnull(jump_to))
return
if(can_access_camera(jump_to))
switch_to_camera(user,jump_to)
//Camera control: mouse.
/atom/DblClick()
..()
if(istype(usr.machine,/obj/machinery/computer/security))
var/obj/machinery/computer/security/console = usr.machine
console.jump_on_click(usr,src)
//Camera control: arrow keys.
/mob/Move(n,direct)
if(istype(machine,/obj/machinery/computer/security))
var/obj/machinery/computer/security/console = machine
var/turf/T = get_turf(console.current)
for(var/i;i<10;i++)
T = get_step(T,direct)
console.jump_on_click(src,T)
return
..(n,direct)
/obj/machinery/computer/security/telescreen
name = "Telescreen"
@@ -87,7 +171,6 @@
icon_state = "telescreen"
network = list("thunder")
density = 0
circuit = null
/obj/machinery/computer/security/telescreen/update_icon()
icon_state = initial(icon_state)
@@ -100,10 +183,6 @@
desc = "Damn, they better have /tg/thechannel on these things."
icon = 'icons/obj/status_display.dmi'
icon_state = "entertainment"
network = list("thunder")
density = 0
circuit = null
/obj/machinery/computer/security/wooden_tv
name = "Security Cameras"
@@ -116,4 +195,9 @@
desc = "Used to access the various cameras on the outpost."
icon_state = "miningcameras"
network = list("MINE")
circuit = "/obj/item/weapon/circuitboard/mining"
/obj/machinery/computer/security/engineering
name = "Engineering Cameras"
desc = "Used to monitor fires and breaches."
icon_state = "engineeringcameras"
network = list("Power Alarms","Atmosphere Alarms","Fire Alarms")

View File

@@ -443,10 +443,7 @@
subject.dna.check_integrity()
var/datum/data/record/R = new /datum/data/record( )
if(subject.dna)
R.fields["mrace"] = subject.dna.mutantrace
else
R.fields["mrace"] = null
R.fields["mrace"] = subject.species
R.fields["ckey"] = subject.ckey
R.fields["name"] = subject.real_name
R.fields["id"] = copytext(md5(subject.real_name), 2, 6)

View File

@@ -0,0 +1,419 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
/obj/machinery/computer/skills//TODO:SANITY
name = "Employment Records"
desc = "Used to view personnel's employment records"
icon_state = "medlaptop"
req_one_access = list(access_heads)
circuit = "/obj/item/weapon/circuitboard/skills"
var/obj/item/weapon/card/id/scan = null
var/authenticated = null
var/rank = null
var/screen = null
var/datum/data/record/active1 = null
var/a_id = null
var/temp = null
var/printing = null
var/can_change_id = 0
var/list/Perp
var/tempname = null
//Sorting Variables
var/sortBy = "name"
var/order = 1 // -1 = Descending - 1 = Ascending
/obj/machinery/computer/skills/attackby(obj/item/O as obj, user as mob)
if(istype(O, /obj/item/weapon/card/id) && !scan)
usr.drop_item()
O.loc = src
scan = O
user << "You insert [O]."
..()
/obj/machinery/computer/skills/attack_ai(mob/user as mob)
return attack_hand(user)
/obj/machinery/computer/skills/attack_paw(mob/user as mob)
return attack_hand(user)
//Someone needs to break down the dat += into chunks instead of long ass lines.
/obj/machinery/computer/skills/attack_hand(mob/user as mob)
if(..())
return
if (src.z > 6)
user << "\red <b>Unable to establish a connection</b>: \black You're too far away from the station!"
return
var/dat
if (temp)
dat = text("<TT>[]</TT><BR><BR><A href='?src=\ref[];choice=Clear Screen'>Clear Screen</A>", temp, src)
else
dat = text("Confirm Identity: <A href='?src=\ref[];choice=Confirm Identity'>[]</A><HR>", src, (scan ? text("[]", scan.name) : "----------"))
if (authenticated)
switch(screen)
if(1.0)
dat += {"
<p style='text-align:center;'>"}
dat += text("<A href='?src=\ref[];choice=Search Records'>Search Records</A><BR>", src)
dat += text("<A href='?src=\ref[];choice=New Record (General)'>New Record</A><BR>", src)
dat += {"
</p>
<table style="text-align:center;" cellspacing="0" width="100%">
<tr>
<th>Records:</th>
</tr>
</table>
<table style="text-align:center;" border="1" cellspacing="0" width="100%">
<tr>
<th><A href='?src=\ref[src];choice=Sorting;sort=name'>Name</A></th>
<th><A href='?src=\ref[src];choice=Sorting;sort=id'>ID</A></th>
<th><A href='?src=\ref[src];choice=Sorting;sort=rank'>Rank</A></th>
<th><A href='?src=\ref[src];choice=Sorting;sort=fingerprint'>Fingerprints</A></th>
</tr>"}
if(!isnull(data_core.general))
for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
for(var/datum/data/record/E in data_core.security)
var/background
dat += text("<tr style=[]><td><A href='?src=\ref[];choice=Browse Record;d_rec=\ref[]'>[]</a></td>", background, src, R, R.fields["name"])
dat += text("<td>[]</td>", R.fields["id"])
dat += text("<td>[]</td>", R.fields["rank"])
dat += text("<td>[]</td>", R.fields["fingerprint"])
dat += "</table><hr width='75%' />"
dat += text("<A href='?src=\ref[];choice=Record Maintenance'>Record Maintenance</A><br><br>", src)
dat += text("<A href='?src=\ref[];choice=Log Out'>{Log Out}</A>",src)
if(2.0)
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)
dat += "<CENTER><B>Employment Record</B></CENTER><BR>"
if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
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 += 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><BR>\n \
Employment/skills summary:<BR> [active1.fields["notes"]]<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>"
dat += text("\n<A href='?src=\ref[];choice=Delete Record (ALL)'>Delete Record (ALL)</A><BR><BR>\n<A href='?src=\ref[];choice=Print Record'>Print Record</A><BR>\n<A href='?src=\ref[];choice=Return'>Back</A><BR>", src, src, src)
if(4.0)
if(!Perp.len)
dat += text("ERROR. String could not be located.<br><br><A href='?src=\ref[];choice=Return'>Back</A>", src)
else
dat += {"
<table style="text-align:center;" cellspacing="0" width="100%">
<tr> "}
dat += text("<th>Search Results for '[]':</th>", tempname)
dat += {"
</tr>
</table>
<table style="text-align:center;" border="1" cellspacing="0" width="100%">
<tr>
<th>Name</th>
<th>ID</th>
<th>Rank</th>
<th>Fingerprints</th>
</tr> "}
for(var/i=1, i<=Perp.len, i += 2)
var/crimstat = ""
var/datum/data/record/R = Perp[i]
if(istype(Perp[i+1],/datum/data/record/))
var/datum/data/record/E = Perp[i+1]
crimstat = E.fields["criminal"]
var/background
background = "'background-color:#00FF7F;'"
dat += text("<tr style=[]><td><A href='?src=\ref[];choice=Browse Record;d_rec=\ref[]'>[]</a></td>", background, src, R, R.fields["name"])
dat += text("<td>[]</td>", R.fields["id"])
dat += text("<td>[]</td>", R.fields["rank"])
dat += text("<td>[]</td>", R.fields["fingerprint"])
dat += text("<td>[]</td></tr>", crimstat)
dat += "</table><hr width='75%' />"
dat += text("<br><A href='?src=\ref[];choice=Return'>Return to index.</A>", src)
else
else
dat += text("<A href='?src=\ref[];choice=Log In'>{Log In}</A>", src)
user << browse(text("<HEAD><TITLE>Employment Records</TITLE></HEAD><TT>[]</TT>", dat), "window=secure_rec;size=600x400")
onclose(user, "secure_rec")
return
/*Revised /N
I can't be bothered to look more of the actual code outside of switch but that probably needs revising too.
What a mess.*/
/obj/machinery/computer/skills/Topic(href, href_list)
if(..())
return
if (!( data_core.general.Find(active1) ))
active1 = null
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
switch(href_list["choice"])
// SORTING!
if("Sorting")
// Reverse the order if clicked twice
if(sortBy == href_list["sort"])
if(order == 1)
order = -1
else
order = 1
else
// New sorting order!
sortBy = href_list["sort"]
order = initial(order)
//BASIC FUNCTIONS
if("Clear Screen")
temp = null
if ("Return")
screen = 1
active1 = null
if("Confirm Identity")
if (scan)
if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
usr.put_in_hands(scan)
else
scan.loc = get_turf(src)
scan = null
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
scan = I
if("Log Out")
authenticated = null
screen = null
active1 = null
if("Log In")
if (istype(usr, /mob/living/silicon/ai))
src.active1 = null
src.authenticated = usr.name
src.rank = "AI"
src.screen = 1
else if (istype(usr, /mob/living/silicon/robot))
src.active1 = null
src.authenticated = usr.name
var/mob/living/silicon/robot/R = usr
src.rank = R.braintype
src.screen = 1
else if (istype(scan, /obj/item/weapon/card/id))
active1 = null
if(check_access(scan))
authenticated = scan.registered_name
rank = scan.assignment
screen = 1
//RECORD FUNCTIONS
if("Search Records")
var/t1 = input("Search String: (Partial Name or ID or Fingerprints or Rank)", "Secure. records", null, null) as text
if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || !in_range(src, usr)))
return
Perp = new/list()
t1 = lowertext(t1)
var/list/components = text2list(t1, " ")
if(components.len > 5)
return //Lets not let them search too greedily.
for(var/datum/data/record/R in data_core.general)
var/temptext = R.fields["name"] + " " + R.fields["id"] + " " + R.fields["fingerprint"] + " " + R.fields["rank"]
for(var/i = 1, i<=components.len, i++)
if(findtext(temptext,components[i]))
var/prelist = new/list(2)
prelist[1] = R
Perp += prelist
for(var/i = 1, i<=Perp.len, i+=2)
for(var/datum/data/record/E in data_core.security)
var/datum/data/record/R = Perp[i]
if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
Perp[i+1] = E
tempname = t1
screen = 4
if("Record Maintenance")
screen = 2
active1 = null
if ("Browse Record")
var/datum/data/record/R = locate(href_list["d_rec"])
if (!( data_core.general.Find(R) ))
temp = "Record Not Found!"
else
for(var/datum/data/record/E in data_core.security)
active1 = R
screen = 3
/* if ("Search Fingerprints")
var/t1 = input("Search String: (Fingerprint)", "Secure. records", null, null) as text
if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!in_range(src, usr)) && (!istype(usr, /mob/living/silicon))))
return
active1 = null
t1 = lowertext(t1)
for(var/datum/data/record/R in data_core.general)
if (lowertext(R.fields["fingerprint"]) == t1)
active1 = R
if (!( active1 ))
temp = text("Could not locate record [].", t1)
else
for(var/datum/data/record/E in data_core.security)
if ((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"]))
screen = 3 */
if ("Print Record")
if (!( printing ))
printing = 1
sleep(50)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
P.info = "<CENTER><B>Employment Record</B></CENTER><BR>"
if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
P.info += text("Name: [] ID: []<BR>\nSex: []<BR>\nAge: []<BR>\nFingerprint: []<BR>\nPhysical Status: []<BR>\nMental Status: []<BR>\nEmployment/Skills Summary:[]<BR>", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"], active1.fields["notes"])
else
P.info += "<B>General Record Lost!</B><BR>"
P.info += "</TT>"
P.name = "paper - 'Employment Record'"
printing = null
//RECORD DELETE
if ("Delete All Records")
temp = ""
temp += "Are you sure you wish to delete all Employment records?<br>"
temp += "<a href='?src=\ref[src];choice=Purge All Records'>Yes</a><br>"
temp += "<a href='?src=\ref[src];choice=Clear Screen'>No</a>"
if ("Purge All Records")
for(var/datum/data/record/R in data_core.security)
del(R)
temp = "All Employment records deleted."
if ("Delete Record (ALL)")
if (active1)
temp = "<h5>Are you sure you wish to delete the record (ALL)?</h5>"
temp += "<a href='?src=\ref[src];choice=Delete Record (ALL) Execute'>Yes</a><br>"
temp += "<a href='?src=\ref[src];choice=Clear Screen'>No</a>"
//RECORD CREATE
if ("New Record (General)")
var/datum/data/record/G = new /datum/data/record()
G.fields["name"] = "New Record"
G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
G.fields["rank"] = "Unassigned"
G.fields["real_rank"] = "Unassigned"
G.fields["sex"] = "Male"
G.fields["age"] = "Unknown"
G.fields["fingerprint"] = "Unknown"
G.fields["p_stat"] = "Active"
G.fields["m_stat"] = "Stable"
G.fields["species"] = "Human"
data_core.general += G
active1 = G
//FIELD FUNCTIONS
if ("Edit Field")
var/a1 = active1
switch(href_list["field"])
if("name")
if (istype(active1, /datum/data/record))
var/t1 = input("Please input name:", "Secure. records", active1.fields["name"], null) as text
if ((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
return
active1.fields["name"] = t1
if("id")
if (istype(active1, /datum/data/record))
var/t1 = copytext(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text),1,MAX_MESSAGE_LEN)
if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["id"] = t1
if("fingerprint")
if (istype(active1, /datum/data/record))
var/t1 = copytext(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text),1,MAX_MESSAGE_LEN)
if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["fingerprint"] = t1
if("sex")
if (istype(active1, /datum/data/record))
if (active1.fields["sex"] == "Male")
active1.fields["sex"] = "Female"
else
active1.fields["sex"] = "Male"
if("age")
if (istype(active1, /datum/data/record))
var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["age"] = t1
if("rank")
var/list/L = list( "Head of Personnel", "Captain", "AI" )
//This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
if ((istype(active1, /datum/data/record) && L.Find(rank)))
temp = "<h5>Rank:</h5>"
temp += "<ul>"
for(var/rank in get_all_jobs())
temp += "<li><a href='?src=\ref[src];choice=Change Rank;rank=[rank]'>[rank]</a></li>"
temp += "</ul>"
else
alert(usr, "You do not have the required rank to do this!")
if("species")
if (istype(active1, /datum/data/record))
var/t1 = copytext(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message),1,MAX_MESSAGE_LEN)
if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["species"] = t1
//TEMPORARY MENU FUNCTIONS
else//To properly clear as per clear screen.
temp=null
switch(href_list["choice"])
if ("Change Rank")
if (active1)
active1.fields["rank"] = href_list["rank"]
if(href_list["rank"] in get_all_jobs())
active1.fields["real_rank"] = href_list["real_rank"]
if ("Delete Record (ALL) Execute")
if (active1)
for(var/datum/data/record/R in data_core.medical)
if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
del(R)
else
del(active1)
else
temp = "This function does not appear to be working at the moment. Our apologies."
add_fingerprint(usr)
updateUsrDialog()
return
/obj/machinery/computer/skills/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
..(severity)
return
for(var/datum/data/record/R in data_core.security)
if(prob(10/severity))
switch(rand(1,6))
if(1)
R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
if(2)
R.fields["sex"] = pick("Male", "Female")
if(3)
R.fields["age"] = rand(5, 85)
if(4)
R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released")
if(5)
R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
if(6)
R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
continue
else if(prob(1))
del(R)
continue
..(severity)

View File

@@ -0,0 +1,106 @@
#define VOX_SHUTTLE_MOVE_TIME 260
#define VOX_SHUTTLE_COOLDOWN 460
//Copied from Syndicate shuttle.
var/global/vox_shuttle_location
/obj/machinery/computer/vox_station
name = "vox skipjack terminal"
icon = 'icons/obj/computer.dmi'
icon_state = "syndishuttle"
req_access = list(access_syndicate)
var/area/curr_location
var/moving = 0
var/lastMove = 0
var/warning //Warning about the end of the round.
/obj/machinery/computer/vox_station/New()
curr_location= locate(/area/shuttle/vox/station)
/obj/machinery/computer/vox_station/proc/vox_move_to(area/destination as area)
if(moving) return
if(lastMove + VOX_SHUTTLE_COOLDOWN > world.time) return
var/area/dest_location = locate(destination)
if(curr_location == dest_location) return
moving = 1
lastMove = world.time
if(curr_location.z != dest_location.z)
var/area/transit_location = locate(/area/vox_station/transit)
curr_location.move_contents_to(transit_location)
curr_location = transit_location
sleep(VOX_SHUTTLE_MOVE_TIME)
curr_location.move_contents_to(dest_location)
curr_location = dest_location
moving = 0
return 1
/obj/machinery/computer/vox_station/attackby(obj/item/I as obj, mob/user as mob)
return attack_hand(user)
/obj/machinery/computer/vox_station/attack_ai(mob/user as mob)
return attack_hand(user)
/obj/machinery/computer/vox_station/attack_paw(mob/user as mob)
return attack_hand(user)
/obj/machinery/computer/vox_station/attack_hand(mob/user as mob)
if(!allowed(user))
user << "\red Access Denied"
return
user.set_machine(src)
var/dat = {"Location: [curr_location]<br>
Ready to move[max(lastMove + VOX_SHUTTLE_COOLDOWN - world.time, 0) ? " in [max(round((lastMove + VOX_SHUTTLE_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]<br>
<a href='?src=\ref[src];start=1'>Return to dark space</a><br>
<a href='?src=\ref[src];solars_fore_port=1'>Fore port solar</a> |
<a href='?src=\ref[src];solars_aft_port=1'>Aft port solar</a> |
<a href='?src=\ref[src];solars_fore_starboard=1'>Fore starboard solar</a><br>
<a href='?src=\ref[src];solars_aft_starboard=1'>Aft starboard solar</a> |
<a href='?src=\ref[src];mining=1'>Mining Asteroid</a><br>
<a href='?src=\ref[user];mach_close=computer'>Close</a>"}
user << browse(dat, "window=computer;size=575x450")
onclose(user, "computer")
return
/obj/machinery/computer/vox_station/Topic(href, href_list)
if(!isliving(usr)) return
var/mob/living/user = usr
if(in_range(src, user) || istype(user, /mob/living/silicon))
user.set_machine(src)
vox_shuttle_location = "station"
if(href_list["start"])
if(ticker && (istype(ticker.mode,/datum/game_mode/heist)))
if(!warning)
user << "\red Returning to dark space will end your raid and report your success or failure. If you are sure, press the button again."
warning = 1
return
vox_move_to(/area/shuttle/vox/station)
vox_shuttle_location = "start"
else if(href_list["solars_fore_starboard"])
vox_move_to(/area/vox_station/northeast_solars)
else if(href_list["solars_fore_port"])
vox_move_to(/area/vox_station/northwest_solars)
else if(href_list["solars_aft_starboard"])
vox_move_to(/area/vox_station/southeast_solars)
else if(href_list["solars_aft_port"])
vox_move_to(/area/vox_station/southwest_solars)
else if(href_list["mining"])
vox_move_to(/area/vox_station/mining)
add_fingerprint(usr)
updateUsrDialog()
return
/obj/machinery/computer/vox_station/bullet_act(var/obj/item/projectile/Proj)
visible_message("[Proj] ricochets off [src]!")

View File

@@ -17,222 +17,287 @@
anchored = 1.0 // can't pick it up
density = 0 // can walk through it.
var/id = null // id of door it controls.
var/releasetime = 0 // when world.time reaches it - release the prisoneer
var/releasetime = 0 // when world.timeofday reaches it - release the prisoner
var/timing = 1 // boolean, true/1 timer is on, false/0 means it's not timing
var/picture_state // icon_state of alert picture, if not displaying text/numbers
var/list/obj/machinery/targets = list()
var/timetoset = 0 // Used to set releasetime upon starting the timer
New()
..()
/obj/machinery/door_timer/New()
..()
pixel_x = ((src.dir & 3)? (0) : (src.dir == 4 ? 32 : -32))
pixel_y = ((src.dir & 3)? (src.dir ==1 ? 24 : -32) : (0))
pixel_x = ((src.dir & 3)? (0) : (src.dir == 4 ? 32 : -32))
pixel_y = ((src.dir & 3)? (src.dir ==1 ? 24 : -32) : (0))
spawn(20)
for(var/obj/machinery/door/window/brigdoor/M in world)
if (M.id == src.id)
targets += M
spawn(20)
for(var/obj/machinery/door/window/brigdoor/M in world)
if (M.id == src.id)
targets += M
for(var/obj/machinery/flasher/F in world)
if(F.id == src.id)
targets += F
for(var/obj/machinery/flasher/F in world)
if(F.id == src.id)
targets += F
for(var/obj/structure/closet/secure_closet/brig/C in world)
if(C.id == src.id)
targets += C
for(var/obj/structure/closet/secure_closet/brig/C in world)
if(C.id == src.id)
targets += C
if(targets.len==0)
stat |= BROKEN
update_icon()
return
if(targets.len==0)
stat |= BROKEN
update_icon()
return
return
//Main door timer loop, if it's timing and time is >0 reduce time by 1.
// if it's less than 0, open door, reset timer
// update the door_timer window and the icon
process()
if(stat & (NOPOWER|BROKEN)) return
if(src.timing)
if(world.time > src.releasetime)
src.timer_end() // open doors, reset timer, clear status screen
src.timing = 0
src.updateUsrDialog()
src.update_icon()
else
timer_end()
return
/obj/machinery/door_timer/process()
if(stat & (NOPOWER|BROKEN)) return
if(src.timing)
// poorly done midnight rollover
// (no seriously there's gotta be a better way to do this)
var/timeleft = timeleft()
if(timeleft > 1e5)
src.releasetime = 0
// has the door power sitatuation changed, if so update icon.
power_change()
..()
update_icon()
return
if(world.timeofday > src.releasetime)
src.timer_end() // open doors, reset timer, clear status screen
src.timing = 0
src.updateUsrDialog()
src.update_icon()
else
timer_end()
return
// has the door power situation changed, if so update icon.
/obj/machinery/door_timer/power_change()
..()
update_icon()
return
// open/closedoor checks if door_timer has power, if so it checks if the
// linked door is open/closed (by density) then opens it/closes it.
proc/timer_start()
if(stat & (NOPOWER|BROKEN)) return 0
for(var/obj/machinery/door/window/brigdoor/door in targets)
if(door.density) continue
spawn(0)
door.close()
// Closes and locks doors, power check
/obj/machinery/door_timer/proc/timer_start()
if(stat & (NOPOWER|BROKEN)) return 0
for(var/obj/structure/closet/secure_closet/brig/C in targets)
if(C.broken) continue
if(C.opened && !C.close()) continue
C.locked = 1
C.icon_state = C.icon_locked
return 1
// Set releasetime
releasetime = world.timeofday + timetoset
for(var/obj/machinery/door/window/brigdoor/door in targets)
if(door.density) continue
spawn(0)
door.close()
for(var/obj/structure/closet/secure_closet/brig/C in targets)
if(C.broken) continue
if(C.opened && !C.close()) continue
C.locked = 1
C.icon_state = C.icon_locked
return 1
proc/timer_end()
if(stat & (NOPOWER|BROKEN)) return 0
// Opens and unlocks doors, power check
/obj/machinery/door_timer/proc/timer_end()
if(stat & (NOPOWER|BROKEN)) return 0
for(var/obj/machinery/door/window/brigdoor/door in targets)
if(!door.density) continue
spawn(0)
door.open()
// Reset releasetime
releasetime = 0
for(var/obj/structure/closet/secure_closet/brig/C in targets)
if(C.broken) continue
if(C.opened) continue
C.locked = 0
C.icon_state = C.icon_closed
for(var/obj/machinery/door/window/brigdoor/door in targets)
if(!door.density) continue
spawn(0)
door.open()
return 1
for(var/obj/structure/closet/secure_closet/brig/C in targets)
if(C.broken) continue
if(C.opened) continue
C.locked = 0
C.icon_state = C.icon_closed
return 1
proc/timeleft()
. = (releasetime-world.time)/10
if(. < 0)
. = 0
// Check for releasetime timeleft
/obj/machinery/door_timer/proc/timeleft()
. = (releasetime - world.timeofday)/10
if(. < 0)
. = 0
// Set timetoset
/obj/machinery/door_timer/proc/timeset(var/seconds)
timetoset = seconds * 10
proc/timeset(var/seconds)
releasetime=world.time+seconds*10
return
if(timetoset <= 0)
timetoset = 0
return
//Allows AIs to use door_timer, see human attack_hand function below
attack_ai(var/mob/user as mob)
return src.attack_hand(user)
/obj/machinery/door_timer/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
//Allows humans to use door_timer
//Opens dialog window when someone clicks on door timer
// Allows altering timer and the timing boolean.
// Flasher activation limited to 150 seconds
attack_hand(var/mob/user as mob)
if(..())
return
var/second = round(timeleft() % 60)
var/minute = round((timeleft() - second) / 60)
user.set_machine(src)
var/dat = "<HTML><BODY><TT>"
dat += "<HR>Timer System:</hr>"
dat += "<b>Door [src.id] controls</b><br/>"
if (src.timing)
dat += "<a href='?src=\ref[src];timing=0'>Stop Timer and open door</a><br/>"
else
dat += "<a href='?src=\ref[src];timing=1'>Activate Timer and close door</a><br/>"
dat += "Time Left: [(minute ? text("[minute]:") : null)][second] <br/>"
dat += "<a href='?src=\ref[src];tp=-60'>-</a> <a href='?src=\ref[src];tp=-1'>-</a> <a href='?src=\ref[src];tp=1'>+</a> <A href='?src=\ref[src];tp=60'>+</a><br/>"
for(var/obj/machinery/flasher/F in targets)
if(F.last_flash && (F.last_flash + 150) > world.time)
dat += "<br/><A href='?src=\ref[src];fc=1'>Flash Charging</A>"
else
dat += "<br/><A href='?src=\ref[src];fc=1'>Activate Flash</A>"
dat += "<br/><br/><a href='?src=\ref[user];mach_close=computer'>Close</a>"
dat += "</TT></BODY></HTML>"
user << browse(dat, "window=computer;size=400x500")
onclose(user, "computer")
/obj/machinery/door_timer/attack_hand(var/mob/user as mob)
if(..())
return
// Used for the 'time left' display
var/second = round(timeleft() % 60)
var/minute = round((timeleft() - second) / 60)
// Used for 'set timer'
var/setsecond = round((timetoset / 10) % 60)
var/setminute = round(((timetoset / 10) - setsecond) / 60)
user.set_machine(src)
// dat
var/dat = "<HTML><BODY><TT>"
dat += "<HR>Timer System:</hr>"
dat += " <b>Door [src.id] controls</b><br/>"
// Start/Stop timer
if (src.timing)
dat += "<a href='?src=\ref[src];timing=0'>Stop Timer and open door</a><br/>"
else
dat += "<a href='?src=\ref[src];timing=1'>Activate Timer and close door</a><br/>"
// Time Left display (uses releasetime)
dat += "Time Left: [(minute ? text("[minute]:") : null)][second] <br/>"
dat += "<br/>"
// Set Timer display (uses timetoset)
if(src.timing)
dat += "Set Timer: [(setminute ? text("[setminute]:") : null)][setsecond] <a href='?src=\ref[src];change=1'>Set</a><br/>"
else
dat += "Set Timer: [(setminute ? text("[setminute]:") : null)][setsecond]<br/>"
// Controls
dat += "<a href='?src=\ref[src];tp=-60'>-</a> <a href='?src=\ref[src];tp=-1'>-</a> <a href='?src=\ref[src];tp=1'>+</a> <A href='?src=\ref[src];tp=60'>+</a><br/>"
// Mounted flash controls
for(var/obj/machinery/flasher/F in targets)
if(F.last_flash && (F.last_flash + 150) > world.time)
dat += "<br/><A href='?src=\ref[src];fc=1'>Flash Charging</A>"
else
dat += "<br/><A href='?src=\ref[src];fc=1'>Activate Flash</A>"
dat += "<br/><br/><a href='?src=\ref[user];mach_close=computer'>Close</a>"
dat += "</TT></BODY></HTML>"
user << browse(dat, "window=computer;size=400x500")
onclose(user, "computer")
return
//Function for using door_timer dialog input, checks if user has permission
// href_list to
// "timing" turns on timer
// "tp" value to modify timer
// "fc" activates flasher
// "change" resets the timer to the timetoset amount while the timer is counting down
// Also updates dialog window and timer icon
Topic(href, href_list)
if(..())
return
if(!src.allowed(usr))
return
/obj/machinery/door_timer/Topic(href, href_list)
if(..())
return
if(!src.allowed(usr))
return
usr.set_machine(src)
if(href_list["timing"])
src.timing = text2num(href_list["timing"])
usr.set_machine(src)
if(href_list["timing"])
src.timing = text2num(href_list["timing"])
else
if(href_list["tp"]) //adjust timer, close door if not already closed
var/tp = text2num(href_list["tp"])
var/timeleft = timeleft()
timeleft += tp
timeleft = min(max(round(timeleft), 0), 3600)
timeset(timeleft)
//src.timing = 1
//src.closedoor()
if(href_list["fc"])
for(var/obj/machinery/flasher/F in targets)
F.flash()
src.add_fingerprint(usr)
src.updateUsrDialog()
src.update_icon()
if(src.timing)
src.timer_start()
else
src.timer_end()
return
else
if(href_list["tp"]) //adjust timer, close door if not already closed
var/tp = text2num(href_list["tp"])
var/addtime = (timetoset / 10)
addtime += tp
addtime = min(max(round(addtime), 0), 3600)
timeset(addtime)
if(href_list["fc"])
for(var/obj/machinery/flasher/F in targets)
F.flash()
if(href_list["change"])
src.timer_start()
src.add_fingerprint(usr)
src.updateUsrDialog()
src.update_icon()
/* if(src.timing)
src.timer_start()
else
src.timer_end() */
return
//icon update function
// if NOPOWER, display blank
// if BROKEN, display blue screen of death icon AI uses
// if timing=true, run update display function
update_icon()
if(stat & (NOPOWER))
icon_state = "frame"
return
if(stat & (BROKEN))
set_picture("ai_bsod")
return
if(src.timing)
var/disp1 = uppertext(id)
var/timeleft = timeleft()
var/disp2 = "[add_zero(num2text((timeleft / 60) % 60),2)]~[add_zero(num2text(timeleft % 60), 2)]"
spawn( 5 )
update_display(disp1, disp2)
else
update_display("SET","TIME")
/obj/machinery/door_timer/update_icon()
if(stat & (NOPOWER))
icon_state = "frame"
return
if(stat & (BROKEN))
set_picture("ai_bsod")
return
if(src.timing)
var/disp1 = uppertext(id)
var/timeleft = timeleft()
var/disp2 = "[add_zero(num2text((timeleft / 60) % 60),2)]~[add_zero(num2text(timeleft % 60), 2)]"
spawn( 5 )
update_display(disp1, disp2)
else
update_display("SET","TIME")
return
// Adds an icon in case the screen is broken/off, stolen from status_display.dm
proc/set_picture(var/state)
picture_state = state
overlays.Cut()
overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)
/obj/machinery/door_timer/proc/set_picture(var/state)
picture_state = state
overlays.Cut()
overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)
//Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display
// Stolen from status_display
proc/update_display(var/line1, var/line2)
if(line2 == null) // single line display
overlays.Cut()
overlays += texticon(line1, 23, -13)
else // dual line display
overlays.Cut()
overlays += texticon(line1, 23, -9)
overlays += texticon(line2, 23, -17)
/obj/machinery/door_timer/proc/update_display(var/line1, var/line2)
if(line2 == null) // single line display
overlays.Cut()
overlays += texticon(line1, 23, -13)
else // dual line display
overlays.Cut()
overlays += texticon(line1, 23, -9)
overlays += texticon(line2, 23, -17)
// return an icon of a time text string (tn)
// valid characters are 0-9 and :
// px, py are pixel offsets
@@ -240,19 +305,19 @@
//Actual string input to icon display for loop, with 5 pixel x offsets for each letter.
//Stolen from status_display
proc/texticon(var/tn, var/px = 0, var/py = 0)
var/image/I = image('icons/obj/status_display.dmi', "blank")
var/len = lentext(tn)
/obj/machinery/door_timer/proc/texticon(var/tn, var/px = 0, var/py = 0)
var/image/I = image('icons/obj/status_display.dmi', "blank")
var/len = lentext(tn)
for(var/d = 1 to len)
var/char = copytext(tn, len-d+1, len-d+2)
if(char == " ")
continue
var/image/ID = image('icons/obj/status_display.dmi', icon_state=char)
ID.pixel_x = -(d-1)*5 + px
ID.pixel_y = py
I.overlays += ID
return I
for(var/d = 1 to len)
var/char = copytext(tn, len-d+1, len-d+2)
if(char == " ")
continue
var/image/ID = image('icons/obj/status_display.dmi', icon_state=char)
ID.pixel_x = -(d-1)*5 + px
ID.pixel_y = py
I.overlays += ID
return I
/obj/machinery/door_timer/cell_1

View File

@@ -915,115 +915,13 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
parent.update_tray()
/obj/item/seeds/replicapod/harvest(mob/user = usr) //now that one is fun -- Urist
var/obj/machinery/hydroponics/parent = loc
var/make_podman = 0
var/mob/ghost
if(ckey && config.revival_pod_plants)
ghost = find_dead_player("[ckey]")
if(ismob(ghost))
if(istype(ghost,/mob/dead/observer))
var/mob/dead/observer/O = ghost
if(istype(mind,/datum/mind))
if(O.can_reenter_corpse)
make_podman = 1
else
make_podman = 1
if(make_podman) //all conditions met!
var/mob/living/carbon/human/podman = new /mob/living/carbon/human(parent.loc)
if(realName)
podman.real_name = realName
else
podman.real_name = "Pod Person [rand(0,999)]"
var/oldactive = mind.active
mind.active = 1
mind.transfer_to(podman)
mind.active = oldactive
// -- Mode/mind specific stuff goes here. TODO! Broken :( Should be merged into mob/living/Login
switch(ticker.mode.name)
if ("revolution")
if (podman.mind in ticker.mode:revolutionaries)
ticker.mode:add_revolutionary(podman.mind)
ticker.mode:update_all_rev_icons() //So the icon actually appears
if (podman.mind in ticker.mode:head_revolutionaries)
ticker.mode:update_all_rev_icons()
if ("nuclear emergency")
if (podman.mind in ticker.mode:syndicates)
ticker.mode:update_all_synd_icons()
if ("cult")
if (podman.mind in ticker.mode:cult)
ticker.mode:add_cultist(podman.mind)
ticker.mode:update_all_cult_icons() //So the icon actually appears
// -- End mode specific stuff
podman.gender = ghost.gender
if(podman.gender in list(NEUTER, PLURAL)) //Sanity check, which should never actually happen.
podman.gender = pick(MALE,FEMALE)
if(!podman.dna)
podman.dna = new /datum/dna()
podman.dna.real_name = podman.real_name
if(ui)
podman.dna.uni_identity = ui
updateappearance(podman, ui)
if(se)
podman.dna.struc_enzymes = se
if(!prob(potency)) //if it fails, plantman!
if(podman)
// podman.dna.mutantrace = "plant"
podman.mutations.Add(PLANT)
podman.update_mutantrace()
else //else, one packet of seeds. maybe two
var/seed_count = 1
if(prob(yield * parent.yieldmod * 20))
seed_count++
for(var/i=0,i<seed_count,i++)
var/obj/item/seeds/replicapod/harvestseeds = new /obj/item/seeds/replicapod(user.loc)
harvestseeds.lifespan = lifespan
harvestseeds.endurance = endurance
harvestseeds.maturation = maturation
harvestseeds.production = production
harvestseeds.yield = yield
harvestseeds.potency = potency
parent.update_tray()
/obj/item/seeds/replicapod/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/reagent_containers))
user << "You inject the contents of the syringe into the seeds."
for(var/datum/reagent/blood/bloodSample in W:reagents.reagent_list)
var/mob/living/carbon/human/source = bloodSample.data["donor"] //hacky, since it gets the CURRENT condition of the mob, not how it was when the blood sample was taken
if (!istype(source))
continue
//ui = bloodSample.data["blood_dna"] doesn't work for whatever reason
ui = source.dna.uni_identity
se = source.dna.struc_enzymes
if(source.ckey)
ckey = source.ckey
else if(source.mind)
ckey = ckey(source.mind.key)
realName = source.real_name
gender = source.gender
if (!isnull(source.mind))
mind = source.mind
W:reagents.clear_reagents()
else
return ..()
/obj/machinery/hydroponics/proc/update_tray(mob/user = usr)
harvest = 0
lastproduce = age
if((yieldmod * myseed.yield) <= 0)
if((yieldmod * myseed.yield) <= 0 || istype(myseed,/obj/item/seeds/replicapod))
user << text("\red You fail to harvest anything useful.")
else
user << text("You harvest from the [myseed.plantname]")
user << text("You harvest from the [myseed.plantname].")
if(myseed.oneharvest)
del(myseed)
planted = 0

View File

@@ -0,0 +1,154 @@
/* Moved all the plant people code here for ease of reference and coherency.
Injecting a pod person with a blood sample will grow a pod person with the memories and persona of that mob.
Growing it to term with nothing injected will grab a ghost from the observers. */
/obj/item/seeds/replicapod
name = "pack of dionaea-replicant seeds"
desc = "These seeds grow into 'replica pods' or 'dionaea', a form of strange sapient plantlife."
icon_state = "seed-replicapod"
mypath = "/obj/item/seeds/replicapod"
species = "replicapod"
plantname = "Dionaea"
productname = "/mob/living/carbon/human" //verrry special -- Urist
lifespan = 50 //no idea what those do
endurance = 8
maturation = 5
production = 10
yield = 1 //seeds if there isn't a dna inside
oneharvest = 1
potency = 30
plant_type = 0
growthstages = 6
var/ckey = null
var/realName = null
var/mob/living/carbon/human/source //Donor of blood, if any.
gender = MALE
/obj/item/seeds/replicapod/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/reagent_containers))
user << "You inject the contents of the syringe into the seeds."
var/datum/reagent/blood/B
//Find a blood sample to inject.
for(var/datum/reagent/R in W:reagents.reagent_list)
if(istype(R,/datum/reagent/blood))
B = R
break
if(B)
source = B.data["donor"]
user << "The strange, sluglike seeds quiver gently and swell with blood."
if(!source.client && source.mind)
for(var/mob/dead/observer/O in player_list)
if(O.mind == source.mind && config.revival_pod_plants)
O << "<b><font color = #330033><font size = 3>Your blood has been placed into a replica pod seed. Return to your body if you want to be returned to life as a pod person!</b> (Verbs -> Ghost -> Re-enter corpse)</font color>"
break
else
user << "Nothing happens."
return
if (!istype(source))
return
if(source.ckey)
realName = source.real_name
ckey = source.ckey
W:reagents.clear_reagents()
return
return ..()
/obj/item/seeds/replicapod/harvest(mob/user = usr)
var/obj/machinery/hydroponics/parent = loc
var/mob/ghost
var/list/candidates = list()
user.visible_message("\blue You carefully begin to open the pod...","[user] carefully begins to open the pod...")
//If a sample is injected (and revival is allowed) the plant will be controlled by the original donor.
if(source && source.mind && source.ckey && config.revival_pod_plants)
ghost = source
else // If no sample was injected or revival is not allowed, we grab an interested observer.
for(var/mob/dead/observer/O in player_list)
if(O.client)
var/response = alert(O, "Someone is harvesting a replica pod. Would you like to play as a Dionaea?", "Replica pod harvest", "Yes", "No")
if(response == "Yes")
candidates += O
if(!do_after(user, 100))
return
if(!src || !user)
return
if(candidates.len)
ghost = pick(candidates)
//If we don't have a ghost or the ghost is now unplayed, we just give the harvester some seeds.
if(!ghost || !(ghost.ckey))
user << "The pod has formed badly, and all you can do is salvage some of the seeds."
var/seed_count = 1
if(prob(yield * parent.yieldmod * 20))
seed_count++
for(var/i=0,i<seed_count,i++)
new /obj/item/seeds/replicapod(user.loc)
parent.update_tray()
return
var/mob/living/carbon/human/podman = new /mob/living/carbon/human(parent.loc)
podman.ckey = ghost.ckey
if(ghost.mind)
ghost.mind.transfer_to(podman)
if(realName)
podman.real_name = realName
else
podman.real_name = "Diona [rand(0,999)]"
podman.gender = NEUTER
podman.dna = new /datum/dna()
podman.dna.real_name = podman.real_name
podman.set_species("Diona")
podman.dna.mutantrace = "plant"
podman.update_mutantrace()
// Update mode specific HUD icons.
switch(ticker.mode.name)
if ("revolution")
if (podman.mind in ticker.mode:revolutionaries)
ticker.mode:add_revolutionary(podman.mind)
ticker.mode:update_all_rev_icons() //So the icon actually appears
if (podman.mind in ticker.mode:head_revolutionaries)
ticker.mode:update_all_rev_icons()
if ("nuclear emergency")
if (podman.mind in ticker.mode:syndicates)
ticker.mode:update_all_synd_icons()
if ("cult")
if (podman.mind in ticker.mode:cult)
ticker.mode:add_cultist(podman.mind)
ticker.mode:update_all_cult_icons() //So the icon actually appears
// -- End mode specific stuff
visible_message("\blue The pod disgorges a fully-formed plant person!")
spawn(0)
podman << "\green <B>You awaken slowly, feeling your sap stir into sluggish motion as the warm air caresses your bark.</B>"
if(source && ckey && podman.ckey == ckey)
podman << "<B>Memories of a life as [source] drift oddly through a mind unsuited for them, like a skin of oil over a fathomless lake.</B>"
podman << "<B>You are now one of the Dionaea, a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders.</B>"
podman << "<B>Too much darkness will send you into shock and starve you, but light will help you heal.</B>"
if(!realName)
var/newname = input(podman,"Enter a name, or leave blank for the default name.", "Name change","") as text
if (newname != "")
podman.real_name = newname
parent.update_tray()

View File

@@ -341,12 +341,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
freq_text = "Engineering"
if(1359)
freq_text = "Security"
// if(1349)
// freq_text = "Mining"
if(1347)
freq_text = "Supply"
if(1441)
freq_text = "Death Squad"
freq_text = "Special Ops"
if(1443)
freq_text = "Response Team"
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
@@ -365,10 +363,35 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/part_b = "</span><b> \icon[radio]\[[freq_text]\][part_b_extra]</b> <span class='message'>" // Tweaked for security headsets -- TLE
var/part_c = "</span></span>"
if (display_freq==SYND_FREQ)
// syndies!
if (display_freq == SYND_FREQ)
part_a = "<span class='syndradio'><span class='name'>"
else if (display_freq==COMM_FREQ)
// centcomm channels (deathsquid and ert)
else if (display_freq in CENT_FREQS)
part_a = "<span class='centradio'><span class='name'>"
// command channel
else if (display_freq == COMM_FREQ)
part_a = "<span class='comradio'><span class='name'>"
// department radio formatting (poorly optimized, ugh)
else if (display_freq == SEC_FREQ)
part_a = "<span class='secradio'><span class='name'>"
else if (display_freq == ENG_FREQ)
part_a = "<span class='engradio'><span class='name'>"
else if (display_freq == SCI_FREQ)
part_a = "<span class='sciradio'><span class='name'>"
else if (display_freq == MED_FREQ)
part_a = "<span class='medradio'><span class='name'>"
else if (display_freq == SUP_FREQ) // cargo
part_a = "<span class='supradio'><span class='name'>"
// If all else fails and it's a dept_freq, color me purple!
else if (display_freq in DEPT_FREQS)
part_a = "<span class='deptradio'><span class='name'>"
@@ -406,8 +429,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
blackbox.msg_deathsquad += blackbox_msg
if(1213)
blackbox.msg_syndicate += blackbox_msg
// if(1349)
// blackbox.msg_mining += blackbox_msg
if(1347)
blackbox.msg_cargo += blackbox_msg
else
@@ -629,8 +650,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
freq_text = "Engineering"
if(1359)
freq_text = "Security"
// if(1349)
// freq_text = "Mining"
if(1347)
freq_text = "Supply"
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
@@ -685,8 +704,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
blackbox.msg_deathsquad += blackbox_msg
if(1213)
blackbox.msg_syndicate += blackbox_msg
// if(1349)
// blackbox.msg_mining += blackbox_msg
if(1347)
blackbox.msg_cargo += blackbox_msg
else

View File

@@ -142,12 +142,7 @@
id = "Supply Server"
freq_listening = list(1347)
autolinkers = list("supply")
/*
/obj/machinery/telecomms/server/presets/mining
id = "Mining Server"
freq_listening = list(1349)
autolinkers = list("mining")
*/
/obj/machinery/telecomms/server/presets/common
id = "Common Server"
freq_listening = list()

File diff suppressed because it is too large Load Diff

View File

@@ -131,8 +131,7 @@
else
if(isliving(src.loc))
return
user.lastDblClick = world.time + 2
user.next_move = world.time + 2
user.delay_click(2)
src.pickup(user)
add_fingerprint(user)
user.put_in_active_hand(src)
@@ -166,8 +165,7 @@
if(istype(src.loc, /mob/living))
return
src.pickup(user)
user.lastDblClick = world.time + 2
user.next_move = world.time + 2
user.delay_click(2)
user.put_in_active_hand(src)
return
@@ -229,6 +227,8 @@
log_attack("<font color='red'>[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])</font>" )
msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG
user.delay_click(10)
//spawn(1800) // this wont work right
// M.lastattacker = null
/////////////////////////

View File

@@ -0,0 +1,22 @@
/obj/item/device/pipe_painter
name = "pipe painter"
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "labeler1"
item_state = "flight"
var/list/modes = list("grey","red","blue","cyan","green","yellow","purple")
var/mode = "grey"
/obj/item/device/pipe_painter/afterattack(atom/A, mob/user as mob)
if(!istype(A,/obj/machinery/atmospherics/pipe) || istype(A,/obj/machinery/atmospherics/pipe/tank) || istype(A,/obj/machinery/atmospherics/pipe/vent) || istype(A,/obj/machinery/atmospherics/pipe/simple/heat_exchanging) || istype(A,/obj/machinery/atmospherics/pipe/simple/insulated))
return
var/obj/machinery/atmospherics/pipe/P = A
P.color = mode
user.visible_message("<span class='notice'>[user] paints \the [P] [mode].</span>","<span class='notice'>You paint \the [P] [mode].</span>")
P.update_icon()
/obj/item/device/pipe_painter/attack_self(mob/user as mob)
mode = input("Which colour do you want to use?","Pipe painter") in modes
/obj/item/device/pipe_painter/examine()
..()
usr << "It is in [mode] mode."

View File

@@ -121,7 +121,8 @@
desc = "An encyption key for a radio headset. Contains cypherkeys."
icon_state = "cargo_cypherkey"
channels = list("Supply" = 1)
/obj/item/device/encryptionkey/ert
name = "NanoTrasen ERT Radio Encryption Key"
desc = "An encyption key for a radio headset. Contains cypherkeys."
channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Mining" = 1, "Cargo" = 1,)
channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1)

View File

@@ -499,8 +499,6 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
freq_text = "Engineering"
if(1359)
freq_text = "Security"
// if(1349)
// freq_text = "Mining"
if(1347)
freq_text = "Supply"
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO

View File

@@ -33,6 +33,7 @@
R.base_icon = "robot"
del(R.module)
R.module = null
R.camera.network.Remove(list("Medical","MINE"))
R.updatename("Default")
R.status_flags |= CANPUSH
R.updateicon()

View File

@@ -11,15 +11,6 @@
var/heal_burn = 0
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
if (M.stat == 2)
var/t_him = "it"
if (M.gender == MALE)
t_him = "him"
else if (M.gender == FEMALE)
t_him = "her"
user << "\red \The [M] is dead, you cannot help [t_him]!"
return 1
if (!istype(M))
user << "\red \The [src] cannot be applied to [M]!"
return 1
@@ -47,42 +38,16 @@
user << "\red This isn't useful at all on a robotic limb.."
return 1
if(src.heal_brute)
if(!affecting.bandage())
user << "\red The wounds on [M]'s [affecting.display_name] have already been bandaged."
return 1
else
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message( "\blue [user] bandages [W.desc] on [M]'s [affecting.display_name].", \
"\blue You bandage [W.desc] on [M]'s [affecting.display_name]." )
//H.add_side_effect("Itch")
else if (istype(W,/datum/wound/bruise))
user.visible_message( "\blue [user] places bruise patch over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place bruise patch over [W.desc] on [M]'s [affecting.display_name]." )
else
user.visible_message( "\blue [user] places bandaid over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place bandaid over [W.desc] on [M]'s [affecting.display_name]." )
else if(src.heal_burn)
if(!affecting.salve())
user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
return 1
else
user.visible_message( "\blue [user] salves wounds on [M]'s [affecting.display_name].", \
"\blue You salve wounds on [M]'s [affecting.display_name]." )
H.UpdateDamageIcon()
else
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
user.visible_message( \
"\blue [M] has been applied with [src] by [user].", \
"\blue You apply \the [src] to [M]." \
)
use(1)
use(1)
M.updatehealth()
/obj/item/stack/medical/bruise_pack
@@ -90,18 +55,60 @@
singular_name = "gauze length"
desc = "Some sterile gauze to wrap around bloody stumps."
icon_state = "brutepack"
heal_brute = 60
origin_tech = "biotech=1"
/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
return 1
if (istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(!affecting.bandage())
user << "\red The wounds on [M]'s [affecting.display_name] have already been bandaged."
return 1
else
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message( "\blue [user] bandages [W.desc] on [M]'s [affecting.display_name].", \
"\blue You bandage [W.desc] on [M]'s [affecting.display_name]." )
//H.add_side_effect("Itch")
else if (istype(W,/datum/wound/bruise))
user.visible_message( "\blue [user] places bruise patch over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place bruise patch over [W.desc] on [M]'s [affecting.display_name]." )
else
user.visible_message( "\blue [user] places bandaid over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place bandaid over [W.desc] on [M]'s [affecting.display_name]." )
use(1)
/obj/item/stack/medical/ointment
name = "ointment"
desc = "Used to treat those nasty burns."
gender = PLURAL
singular_name = "ointment"
icon_state = "ointment"
heal_burn = 40
heal_burn = 1
origin_tech = "biotech=1"
/obj/item/stack/medical/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
return 1
if (istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(!affecting.salve())
user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
return 1
else
user.visible_message( "\blue [user] salves wounds on [M]'s [affecting.display_name].", \
"\blue You salve wounds on [M]'s [affecting.display_name]." )
use(1)
/obj/item/stack/medical/bruise_pack/tajaran
name = "\improper S'rendarr's Hand leaf"
singular_name = "S'rendarr's Hand leaf"
@@ -126,6 +133,34 @@
heal_brute = 12
origin_tech = "biotech=1"
/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
return 1
if (istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(!affecting.bandage())
user << "\red The wounds on [M]'s [affecting.display_name] have already been treated."
return 1
else
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
if (W.current_stage <= W.max_bleeding_stage)
user.visible_message( "\blue [user] cleans [W.desc] on [M]'s [affecting.display_name] and seals edges with bioglue.", \
"\blue You clean and seal [W.desc] on [M]'s [affecting.display_name]." )
//H.add_side_effect("Itch")
else if (istype(W,/datum/wound/bruise))
user.visible_message( "\blue [user] places medicine patch over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place medicine patch over [W.desc] on [M]'s [affecting.display_name]." )
else
user.visible_message( "\blue [user] smears some bioglue over [W.desc] on [M]'s [affecting.display_name].", \
"\blue You smear some bioglue over [W.desc] on [M]'s [affecting.display_name]." )
affecting.heal_damage(heal_brute,0)
use(1)
/obj/item/stack/medical/advanced/ointment
name = "advanced burn kit"
singular_name = "advanced burn kit"
@@ -134,8 +169,26 @@
heal_burn = 12
origin_tech = "biotech=1"
/obj/item/stack/medical/advanced/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
return 1
if (istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(!affecting.salve())
user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
return 1
else
user.visible_message( "\blue [user] covers wounds on [M]'s [affecting.display_name] with regenerative membrane.", \
"\blue You cover wounds on [M]'s [affecting.display_name] with regenerative membrane." )
affecting.heal_damage(0,heal_burn)
use(1)
/obj/item/stack/medical/splint
name = "medical splint"
name = "medical splints"
singular_name = "medical splint"
icon_state = "splint"
amount = 5
@@ -143,3 +196,38 @@
/obj/item/stack/medical/splint/single
amount = 1
/obj/item/stack/medical/splint/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
return 1
if (istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
var/limb = affecting.display_name
if(!((affecting.name == "l_arm") || (affecting.name == "r_arm") || (affecting.name == "l_leg") || (affecting.name == "r_leg")))
user << "\red You can't apply a splint there!"
return
if(affecting.status & ORGAN_SPLINTED)
user << "\red [M]'s [limb] is already splinted!"
return
if (M != user)
user.visible_message("\red [user] starts to apply \the [src] to [M]'s [limb].", "\red You start to apply \the [src] to [M]'s [limb].", "\red You hear something being wrapped.")
else
if((!user.hand && affecting.name == "r_arm") || (user.hand && affecting.name == "l_arm"))
user << "\red You can't apply a splint to the arm you're using!"
return
user.visible_message("\red [user] starts to apply \the [src] to their [limb].", "\red You start to apply \the [src] to your [limb].", "\red You hear something being wrapped.")
if(do_after(user, 50))
if (M != user)
user.visible_message("\red [user] finishes applying \the [src] to [M]'s [limb].", "\red You finish applying \the [src] to [M]'s [limb].", "\red You hear something being wrapped.")
else
if(prob(25))
user.visible_message("\red [user] successfully applies \the [src] to their [limb].", "\red You successfully apply \the [src] to your [limb].", "\red You hear something being wrapped.")
else
user.visible_message("\red [user] fumbles \the [src].", "\red You fumble \the [src].", "\red You hear something being wrapped.")
return
affecting.status |= ORGAN_SPLINTED
use(1)
return

View File

@@ -14,7 +14,6 @@
m_amt = 90
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
var/max_water = 50
var/last_use = 1.0
var/safety = 1
var/sprite_name = "fire_extinguisher"
@@ -67,11 +66,6 @@
usr << "\red \The [src] is empty."
return
if (world.time < src.last_use + 20)
return
src.last_use = world.time
playsound(src.loc, 'sound/effects/extinguish.ogg', 75, 1, -3)
var/direction = get_dir(src,target)

View File

@@ -461,3 +461,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
islegal()
return 0
/obj/item/weapon/implant/cortical
name = "cortical stack"
desc = "A fist-sized mass of biocircuits and chips."

View File

@@ -12,7 +12,7 @@
icon_state ="bookEngineering"
author = "Engineering Encyclopedia" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
title = "Station Repairs and Construction"
dat = {"
/*dat = {"
<html><head>
</head>
@@ -23,7 +23,7 @@
</html>
"}
"}*/
/obj/item/weapon/book/manual/engineering_particle_accelerator
name = "Particle Accelerator User's Guide"
@@ -32,7 +32,7 @@
title = "Particle Accelerator User's Guide"
//big pile of shit below.
dat = {"<html>
/*dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
@@ -65,7 +65,7 @@
</ol>
</body>
</html>"}
</html>"}*/
/obj/item/weapon/book/manual/engineering_hacking
@@ -75,7 +75,7 @@
title = "Hacking"
//big pile of shit below.
dat = {"
/*dat = {"
<html><head>
</head>
@@ -86,7 +86,7 @@
</html>
"}
"}*/
/obj/item/weapon/book/manual/engineering_singularity_safety
name = "Singularity Safety in Special Circumstances"
@@ -95,7 +95,7 @@
title = "Singularity Safety in Special Circumstances"
//big pile of shit below.
dat = {"<html>
/*dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
@@ -134,14 +134,14 @@
Step one: <b>GET THE FUCK OUT OF THERE!!! FORGET THE WOMEN AND CHILDREN, SAVE YOURSELF!!!</b><br>
</body>
</html>
"}
"}*/
/obj/item/weapon/book/manual/hydroponics_pod_people
name = "The Human Harvest - From seed to market"
icon_state ="bookHydroponicsPodPeople"
author = "Farmer John"
title = "The Human Harvest - From seed to market"
dat = {"<html>
/*dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
@@ -169,7 +169,7 @@
</body>
</html>
"}
"}*/
/obj/item/weapon/book/manual/medical_cloning
name = "Cloning techniques of the 26th century"
@@ -178,7 +178,7 @@
title = "Cloning techniques of the 26th century"
//big pile of shit below.
dat = {"<html>
/*dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
@@ -246,7 +246,7 @@
</body>
</html>
"}
"}*/
/obj/item/weapon/book/manual/ripley_build_and_repair
@@ -256,7 +256,7 @@
title = "APLU \"Ripley\" Construction and Operation Manual"
//big pile of shit below.
dat = {"<html>
/*dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
@@ -322,7 +322,7 @@
<h2>Operation</h2>
Coming soon...
"}
"}*/
/obj/item/weapon/book/manual/research_and_development
@@ -330,7 +330,8 @@
icon_state = "rdbook"
author = "Dr. L. Ight"
title = "Research and Development 101"
dat = {"<html>
/*dat = {"
<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
@@ -372,7 +373,7 @@
Many machines produces from circuit boards and inserted into a machine frame require a variety of parts to construct. These are parts like capacitors, batteries, matter bins, and so forth. As your knowledge of science improves, more advanced versions are unlocked. If you use these parts when constructing something, its attributes may be improved. For example, if you use an advanced matter bin when constructing an autolathe (rather then a regular one), it'll hold more materials. Experiment around with stock parts of various qualities to see how they affect the end results! Be warned, however: Tier 3 and higher stock parts don't have 100% reliability and their low reliability may affect the reliability of the end machine.
</body>
</html>
"}
"}*/
/obj/item/weapon/book/manual/robotics_cyborgs
@@ -380,7 +381,7 @@
icon_state = "borgbook"
author = "XISC"
title = "Cyborgs for Dummies"
dat = {"<html>
/*dat = {"<html>
<head>
<style>
h1 {font-size: 21px; margin: 15px 0px 5px;}
@@ -575,7 +576,7 @@
</body>
</html>
"}
"}*/
/obj/item/weapon/book/manual/security_space_law
name = "Space Law"
@@ -583,7 +584,7 @@
icon_state = "bookSpaceLaw"
author = "Nanotrasen"
title = "Space Law"
dat = {"
/*dat = {"
<html><head>
</head>
@@ -593,14 +594,14 @@
</html>
"}
"}*/
/obj/item/weapon/book/manual/engineering_guide
name = "Engineering Textbook"
icon_state ="bookEngineering2"
author = "Engineering Encyclopedia"
title = "Engineering Textbook"
dat = {"
/*dat = {"
<html><head>
</head>
@@ -610,7 +611,7 @@
</html>
"}
"}*/
/obj/item/weapon/book/manual/chef_recipes
@@ -618,7 +619,7 @@
icon_state = "cooked_book"
author = "Lord Frenrir Cageth"
title = "Chef Recipes"
dat = {"<html>
/*dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
@@ -663,14 +664,14 @@
</body>
</html>
"}
"}*/
/obj/item/weapon/book/manual/barman_recipes
name = "Barman Recipes"
icon_state = "barbook"
author = "Sir John Rose"
title = "Barman Recipes"
dat = {"<html>
/*dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
@@ -715,7 +716,7 @@
</body>
</html>
"}
"}*/
/obj/item/weapon/book/manual/detective
@@ -723,7 +724,7 @@
icon_state ="bookDetective"
author = "Nanotrasen"
title = "The Film Noir: Proper Procedures for Investigations"
dat = {"<html>
/*dat = {"<html>
<head>
<style>
h1 {font-size: 18px; margin: 15px 0px 5px;}
@@ -757,14 +758,14 @@
It really is that easy! Good luck!
</body>
</html>"}
</html>"}*/
/obj/item/weapon/book/manual/nuclear
name = "Fission Mailed: Nuclear Sabotage 101"
icon_state ="bookNuclear"
author = "Syndicate"
title = "Fission Mailed: Nuclear Sabotage 101"
dat = {"<html>
/*dat = {"<html>
Nuclear Explosives 101:<br>
Hello and thank you for choosing the Syndicate for your nuclear information needs.<br>
Today's crash course will deal with the operation of a Fusion Class Nanotrasen made Nuclear Device.<br>
@@ -792,4 +793,4 @@
<b>Disk, Code, Safety, Timer, Disk, RUN!</b><br>
Intelligence Analysts believe that normal Nanotrasen procedure is for the Captain to secure the nuclear authorisation disk.<br>
Good luck!
</html>"}
</html>"}*/

View File

@@ -222,6 +222,21 @@
new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src)
new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src)
/obj/item/weapon/storage/box/cdeathalarm_kit
name = "Death Alarm Kit"
desc = "Box of stuff used to implant death alarms."
icon_state = "implant"
item_state = "syringe_kit"
New()
..()
new /obj/item/weapon/implanter(src)
new /obj/item/weapon/implantcase/death_alarm(src)
new /obj/item/weapon/implantcase/death_alarm(src)
new /obj/item/weapon/implantcase/death_alarm(src)
new /obj/item/weapon/implantcase/death_alarm(src)
new /obj/item/weapon/implantcase/death_alarm(src)
new /obj/item/weapon/implantcase/death_alarm(src)
/obj/item/weapon/storage/box/condimentbottles
name = "box of condiment bottles"
@@ -424,6 +439,14 @@
W.update_icon()
return
/obj/item/weapon/storage/box/autoinjectors
name = "box of injectors"
desc = "Contains autoinjectors."
icon_state = "syringe"
New()
..()
for (var/i; i < storage_slots; i++)
new /obj/item/weapon/reagent_containers/hypospray/autoinjector(src)
/obj/item/weapon/storage/box/lights
name = "replacement bulbs"
@@ -460,4 +483,4 @@
for(var/i = 0; i < 14; i++)
new /obj/item/weapon/light/tube(src)
for(var/i = 0; i < 7; i++)
new /obj/item/weapon/light/bulb(src)
new /obj/item/weapon/light/bulb(src)

View File

@@ -30,7 +30,7 @@
icon_state = pick("ointment","firefirstaid")
new /obj/item/device/healthanalyzer( src )
new /obj/item/weapon/reagent_containers/syringe/inaprovaline( src )
new /obj/item/weapon/reagent_containers/hypospray/autoinjector( src )
new /obj/item/stack/medical/ointment( src )
new /obj/item/stack/medical/ointment( src )
new /obj/item/weapon/reagent_containers/pill/kelotane( src )
@@ -51,7 +51,7 @@
new /obj/item/stack/medical/ointment(src)
new /obj/item/stack/medical/ointment(src)
new /obj/item/device/healthanalyzer(src)
new /obj/item/weapon/reagent_containers/syringe/inaprovaline( src )
new /obj/item/weapon/reagent_containers/hypospray/autoinjector( src )
return
/obj/item/weapon/storage/firstaid/toxin
@@ -88,11 +88,28 @@
new /obj/item/weapon/reagent_containers/pill/dexalin( src )
new /obj/item/weapon/reagent_containers/pill/dexalin( src )
new /obj/item/weapon/reagent_containers/pill/dexalin( src )
new /obj/item/weapon/reagent_containers/syringe/inaprovaline( src )
new /obj/item/weapon/reagent_containers/hypospray/autoinjector( src )
new /obj/item/weapon/reagent_containers/syringe/inaprovaline( src )
new /obj/item/device/healthanalyzer( src )
return
/obj/item/weapon/storage/firstaid/adv
name = "advanced first-aid kit"
desc = "Contains advanced medical treatments."
icon_state = "advfirstaid"
item_state = "firstaid-advanced"
/obj/item/weapon/storage/firstaid/adv/New()
..()
if (empty) return
new /obj/item/weapon/reagent_containers/hypospray/autoinjector( src )
new /obj/item/stack/medical/advanced/bruise_pack(src)
new /obj/item/stack/medical/advanced/bruise_pack(src)
new /obj/item/stack/medical/advanced/bruise_pack(src)
new /obj/item/stack/medical/advanced/ointment(src)
new /obj/item/stack/medical/advanced/ointment(src)
new /obj/item/stack/medical/splint(src)
return
/*
* Pill Bottles
*/

View File

@@ -29,7 +29,7 @@
..()
if(air_contents.oxygen < 10)
usr << text("\red <B>The meter on the [src.name] indicates you are almost out of air!</B>")
playsound(usr, 'sound/effects/alert.ogg', 50, 1)
//playsound(usr, 'sound/effects/alert.ogg', 50, 1)
/obj/item/weapon/tank/oxygen/yellow
@@ -186,4 +186,4 @@
..()
if(air_contents.nitrogen < 10)
usr << text("\red <B>The meter on the [src.name] indicates you are almost out of air!</B>")
playsound(usr, 'sound/effects/alert.ogg', 50, 1)
//playsound(usr, 'sound/effects/alert.ogg', 50, 1)

View File

@@ -29,6 +29,7 @@
new /obj/item/clothing/mask/gas(src)
new /obj/item/device/multitool(src)
new /obj/item/device/flash(src)
new /obj/item/taperoll/engineering(src)
return
@@ -118,4 +119,4 @@
new /obj/item/clothing/glasses/meson(src)
new /obj/item/taperoll/engineering(src)
new /obj/item/taperoll/engineering(src)
return
return

View File

@@ -13,6 +13,7 @@
New()
..()
sleep(2)
new /obj/item/weapon/storage/box/autoinjectors(src)
new /obj/item/weapon/storage/box/syringes(src)
new /obj/item/weapon/reagent_containers/dropper(src)
new /obj/item/weapon/reagent_containers/dropper(src)

View File

@@ -111,6 +111,7 @@
new /obj/item/weapon/cartridge/hos(src)
new /obj/item/device/radio/headset/heads/hos(src)
new /obj/item/clothing/glasses/sunglasses/sechud(src)
new /obj/item/taperoll/police(src)
new /obj/item/weapon/shield/riot(src)
new /obj/item/weapon/storage/lockbox/loyalty(src)
new /obj/item/weapon/storage/box/flashbangs(src)
@@ -149,6 +150,7 @@
// new /obj/item/weapon/cartridge/security(src)
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/clothing/glasses/sunglasses/sechud(src)
new /obj/item/taperoll/police(src)
new /obj/item/weapon/storage/box/flashbangs(src)
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
@@ -252,6 +254,7 @@
new /obj/item/clothing/suit/armor/det_suit(src)
new /obj/item/ammo_magazine/c38(src)
new /obj/item/ammo_magazine/c38(src)
new /obj/item/taperoll/police(src)
new /obj/item/weapon/gun/projectile/detective(src)
new /obj/item/clothing/tie/holster/armpit(src)
return

View File

@@ -35,6 +35,7 @@
user.visible_message("<span class='warning'>[user] kicks [src].</span>", \
"<span class='warning'>You kick [src].</span>", \
"You hear twisting metal.")
user.delay_click(10)
if(shock(user, 70))
return
@@ -51,6 +52,7 @@
user.visible_message("<span class='warning'>[user] mangles [src].</span>", \
"<span class='warning'>You mangle [src].</span>", \
"You hear twisting metal.")
user.delay_click(10)
if(!shock(user, 70))
health -= 5
@@ -64,6 +66,7 @@
user.visible_message("<span class='warning'>[user] smashes against [src].</span>", \
"<span class='warning'>You smash against [src].</span>", \
"You hear twisting metal.")
user.delay_click(10)
health -= rand(2,3)
healthcheck()
@@ -76,6 +79,7 @@
M.visible_message("<span class='warning'>[M] smashes against [src].</span>", \
"<span class='warning'>You smash against [src].</span>", \
"You hear twisting metal.")
M.delay_click(10)
health -= M.melee_damage_upper
healthcheck()
@@ -160,8 +164,10 @@
else if(istype(W, /obj/item/weapon/shard))
health -= W.force * 0.1
user.delay_click(10)
else if(!shock(user, 70))
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
user.delay_click(10)
switch(W.damtype)
if("fire")
health -= W.force

View File

@@ -52,6 +52,8 @@
user << "<span class='notice'>You put [I] in [src].</span>"
else
user << "<span class='notice'>[src] is full.</span>"
updateUsrDialog()
return
if(istype(I, /obj/item/weapon/tank/plasma))
if(plasmatanks < 10)
user.drop_item()
@@ -61,8 +63,16 @@
user << "<span class='notice'>You put [I] in [src].</span>"
else
user << "<span class='notice'>[src] is full.</span>"
updateUsrDialog()
updateUsrDialog()
return
if(istype(I, /obj/item/weapon/wrench))
if(anchored)
user << "<span class='notice'>You lean down and unwrench [src].</span>"
anchored = 0
else
user << "<span class='notice'>You wrench [src] into place.</span>"
anchored = 1
return
/obj/structure/dispenser/Topic(href, href_list)
if(usr.stat || usr.restrained())

View File

@@ -104,16 +104,19 @@
new /obj/item/weapon/shard(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
usr.delay_click(10)
else if (usr.a_intent == "hurt")
playsound(src.loc, 'glassknock.ogg', 80, 1)
usr.visible_message("\red [usr.name] bangs against the [src.name]!", \
"\red You bang against the [src.name]!", \
"You hear a banging sound.")
usr.delay_click(5)
else
playsound(src.loc, 'glassknock.ogg', 80, 1)
usr.visible_message("[usr.name] knocks on the [src.name].", \
"You knock on the [src.name].", \
"You hear a knocking sound.")
usr.delay_click(5)
return
@@ -128,9 +131,11 @@
new /obj/item/weapon/shard(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
user.delay_click(10)
else //for nicer text~
user.visible_message("<span class='danger'>[user] smashes into [src]!</span>")
playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
user.delay_click(10)
/obj/structure/window/attack_alien(mob/user as mob)
@@ -158,6 +163,7 @@
var/mob/living/M = G.affecting
var/state = G.state
del(W) //gotta delete it here because if window breaks, it won't get deleted
user.delay_click(10)
switch (state)
if(1)
M.apply_damage(7)
@@ -197,6 +203,7 @@
else
if(W.damtype == BRUTE || W.damtype == BURN)
hit(W.force)
user.delay_click(10)
if(health <= 7)
anchored = 0
update_nearby_icons()

View File

@@ -3,8 +3,9 @@
var/list/response_team_members = list()
var/global/send_emergency_team = 0 // Used for automagic response teams
// 'admin_emergency_team' for admin-spawned response teams
// 'admin_emergency_team' for admin-spawned response teams
var/ert_base_chance = 10 // Default base chance. Will be incremented by increment ERT chance.
var/can_call_ert
/client/proc/response_team()
set name = "Dispatch Emergency Response Team"
@@ -26,7 +27,7 @@ var/global/send_emergency_team = 0 // Used for automagic response teams
if(alert("Do you want to dispatch an Emergency Response Team?",,"Yes","No") != "Yes")
return
if(get_security_level() != "red") // Allow admins to reconsider if the alert level isn't Red
switch(alert("The station has not entered code red recently. Do you still want to dispatch a response team?",,"Yes","No"))
switch(alert("The station is not in red alert. Do you still want to dispatch a response team?",,"Yes","No"))
if("No")
return
if(send_emergency_team)
@@ -102,12 +103,28 @@ proc/percentage_antagonists()
if(total == 0) return 0
else return round(100 * antagonists / total)
// Increments the ERT chance automatically, so that the later it is in the round,
// the more likely an ERT is to be able to be called.
proc/increment_ert_chance()
while(send_emergency_team == 0) // There is no ERT at the time.
if(get_security_level() == "green")
ert_base_chance += 1
if(get_security_level() == "blue")
ert_base_chance += 2
if(get_security_level() == "red")
ert_base_chance += 3
if(get_security_level() == "delta")
ert_base_chance += 10 // Need those big guns
sleep(600 * 3) // Minute * Number of Minutes
proc/trigger_armed_response_team(var/force = 0)
if(!can_call_ert && !force)
return
if(send_emergency_team)
return
var/send_team_chance = 50 // base chance that a team will be sent
var/send_team_chance = ert_base_chance // Is incremented by increment_ert_chance.
send_team_chance += 2*percentage_dead() // the more people are dead, the higher the chance
send_team_chance += percentage_antagonists() // the more antagonists, the higher the chance
send_team_chance = min(send_team_chance, 100)
@@ -115,12 +132,19 @@ proc/trigger_armed_response_team(var/force = 0)
if(force) send_team_chance = 100
// there's only a certain chance a team will be sent
if(!prob(send_team_chance)) return
if(!prob(send_team_chance))
command_alert("It would appear that an emergency response team was requested for [station_name()]. Unfortunately, we were unable to send one at this time.", "Central Command")
can_call_ert = 0 // Only one call per round, ladies.
return
command_alert("Sensors indicate that [station_name()] has entered Code Red and is in need of assistance. We will prepare and dispatch an emergency response team to deal with the situation.", "Central Command")
command_alert("It would appear that an emergency response team was requested for [station_name()]. We will prepare and send one as soon as possible.", "Central Command")
can_call_ert = 0 // Only one call per round, gentleman.
send_emergency_team = 1
sleep(600 * 5)
send_emergency_team = 0 // Can no longer join the ERT.
/* var/area/security/nuke_storage/nukeloc = locate()//To find the nuke in the vault
var/obj/machinery/nuclearbomb/nuke = locate() in nukeloc
if(!nuke)
@@ -258,12 +282,6 @@ proc/trigger_armed_response_team(var/force = 0)
//Special radio setup
equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(src), slot_ears)
//Adding Camera Network
var/obj/machinery/camera/camera = new /obj/machinery/camera(src) //Gives all the commandos internals cameras.
camera.network = list("CREED")
camera.c_tag = real_name
//Replaced with new ERT uniform
equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(src), slot_shoes)

View File

@@ -48,41 +48,42 @@ var/global/floorIsLava = 0
else
body += " \[<A href='?src=\ref[src];revive=\ref[M]'>Heal</A>\] "
body += "<br><br>\[ "
body += "<a href='?_src_=vars;Vars=\ref[M]'>VV</a> - "
body += "<a href='?src=\ref[src];traitor=\ref[M]'>TP</a> - "
body += "<a href='?src=\ref[usr];priv_msg=\ref[M]'>PM</a> - "
body += "<a href='?src=\ref[src];subtlemessage=\ref[M]'>SM</a> - "
body += "<a href='?src=\ref[src];adminplayerobservejump=\ref[M]'>JMP</a>\] </b><br>"
body += "<b>Mob type</b> = [M.type]<br><br>"
body += "<A href='?src=\ref[src];boot2=\ref[M]'>Kick</A> | "
body += "<A href='?_src_=holder;warn=[M.ckey]'>Warn</A> | "
body += "<A href='?src=\ref[src];newban=\ref[M]'>Ban</A> | "
body += "<A href='?src=\ref[src];jobban2=\ref[M]'>Jobban</A> | "
body += "<A href='?src=\ref[src];notes=show;mob=\ref[M]'>Notes</A> "
body += {"
<br><br>\[
<a href='?_src_=vars;Vars=\ref[M]'>VV</a> -
<a href='?src=\ref[src];traitor=\ref[M]'>TP</a> -
<a href='?src=\ref[usr];priv_msg=\ref[M]'>PM</a> -
<a href='?src=\ref[src];subtlemessage=\ref[M]'>SM</a> -
<a href='?src=\ref[src];adminplayerobservejump=\ref[M]'>JMP</a>\] </b><br>
<b>Mob type</b> = [M.type]<br><br>
<A href='?src=\ref[src];boot2=\ref[M]'>Kick</A> |
<A href='?_src_=holder;warn=[M.ckey]'>Warn</A> |
<A href='?src=\ref[src];newban=\ref[M]'>Ban</A> |
<A href='?src=\ref[src];jobban2=\ref[M]'>Jobban</A> |
<A href='?src=\ref[src];notes=show;mob=\ref[M]'>Notes</A>
"}
if(M.client)
body += "| <A HREF='?src=\ref[src];sendtoprison=\ref[M]'>Prison</A> | "
var/muted = M.client.prefs.muted
body += "<br><b>Mute: </b> "
body += "\[<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_IC]'><font color='[(muted & MUTE_IC)?"red":"blue"]'>IC</font></a> | "
body += "<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_OOC]'><font color='[(muted & MUTE_OOC)?"red":"blue"]'>OOC</font></a> | "
body += "<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_PRAY]'><font color='[(muted & MUTE_PRAY)?"red":"blue"]'>PRAY</font></a> | "
body += "<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_ADMINHELP]'><font color='[(muted & MUTE_ADMINHELP)?"red":"blue"]'>ADMINHELP</font></a> | "
body += "<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_DEADCHAT]'><font color='[(muted & MUTE_DEADCHAT)?"red":"blue"]'>DEADCHAT</font></a>\]"
body += "(<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_ALL]'><font color='[(muted & MUTE_ALL)?"red":"blue"]'>toggle all</font></a>)"
body += {"<br><b>Mute: </b>
\[<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_IC]'><font color='[(muted & MUTE_IC)?"red":"blue"]'>IC</font></a> |
<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_OOC]'><font color='[(muted & MUTE_OOC)?"red":"blue"]'>OOC</font></a> |
<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_PRAY]'><font color='[(muted & MUTE_PRAY)?"red":"blue"]'>PRAY</font></a> |
<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_ADMINHELP]'><font color='[(muted & MUTE_ADMINHELP)?"red":"blue"]'>ADMINHELP</font></a> |
<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_DEADCHAT]'><font color='[(muted & MUTE_DEADCHAT)?"red":"blue"]'>DEADCHAT</font></a>\]
(<A href='?src=\ref[src];mute=\ref[M];mute_type=[MUTE_ALL]'><font color='[(muted & MUTE_ALL)?"red":"blue"]'>toggle all</font></a>)
"}
body += "<br><br>"
body += "<A href='?src=\ref[src];jumpto=\ref[M]'><b>Jump to</b></A> | "
body += "<A href='?src=\ref[src];getmob=\ref[M]'>Get</A> | "
body += "<A href='?src=\ref[src];sendmob=\ref[M]'>Send To</A>"
body += "<br><br>"
body += "<A href='?src=\ref[src];traitor=\ref[M]'>Traitor panel</A> | "
body += "<A href='?src=\ref[src];narrateto=\ref[M]'>Narrate to</A> | "
body += "<A href='?src=\ref[src];subtlemessage=\ref[M]'>Subtle message</A>"
body += {"<br><br>
<A href='?src=\ref[src];jumpto=\ref[M]'><b>Jump to</b></A> |
<A href='?src=\ref[src];getmob=\ref[M]'>Get</A> |
<A href='?src=\ref[src];sendmob=\ref[M]'>Send To</A>
<br><br>
<A href='?src=\ref[src];traitor=\ref[M]'>Traitor panel</A> |
<A href='?src=\ref[src];narrateto=\ref[M]'>Narrate to</A> |
<A href='?src=\ref[src];subtlemessage=\ref[M]'>Subtle message</A>
"}
if (M.client)
if(!istype(M, /mob/new_player))
@@ -106,10 +107,11 @@ var/global/floorIsLava = 0
if(isAI(M))
body += "<B>Is an AI</B> "
else if(ishuman(M))
body += "<A href='?src=\ref[src];makeai=\ref[M]'>Make AI</A> | "
body += "<A href='?src=\ref[src];makerobot=\ref[M]'>Make Robot</A> | "
body += "<A href='?src=\ref[src];makealien=\ref[M]'>Make Alien</A> | "
body += "<A href='?src=\ref[src];makeslime=\ref[M]'>Make slime</A> "
body += {"<A href='?src=\ref[src];makeai=\ref[M]'>Make AI</A> |
<A href='?src=\ref[src];makerobot=\ref[M]'>Make Robot</A> |
<A href='?src=\ref[src];makealien=\ref[M]'>Make Alien</A> |
<A href='?src=\ref[src];makeslime=\ref[M]'>Make slime</A>
"}
//Simple Animals
if(isanimal(M))
@@ -117,45 +119,46 @@ var/global/floorIsLava = 0
else
body += "<A href='?src=\ref[src];makeanimal=\ref[M]'>Animalize</A> | "
body += "<br><br>"
body += "<b>Rudimentary transformation:</b><font size=2><br>These transformations only create a new mob type and copy stuff over. They do not take into account MMIs and similar mob-specific things. The buttons in 'Transformations' are preferred, when possible.</font><br>"
body += "<A href='?src=\ref[src];simplemake=observer;mob=\ref[M]'>Observer</A> | "
body += "\[ Alien: <A href='?src=\ref[src];simplemake=drone;mob=\ref[M]'>Drone</A>, "
body += "<A href='?src=\ref[src];simplemake=hunter;mob=\ref[M]'>Hunter</A>, "
body += "<A href='?src=\ref[src];simplemake=queen;mob=\ref[M]'>Queen</A>, "
body += "<A href='?src=\ref[src];simplemake=sentinel;mob=\ref[M]'>Sentinel</A>, "
body += "<A href='?src=\ref[src];simplemake=larva;mob=\ref[M]'>Larva</A> \] "
body += "<A href='?src=\ref[src];simplemake=human;mob=\ref[M]'>Human</A> "
body += "\[ slime: <A href='?src=\ref[src];simplemake=slime;mob=\ref[M]'>Baby</A>, "
body += "<A href='?src=\ref[src];simplemake=adultslime;mob=\ref[M]'>Adult</A> \] "
body += "<A href='?src=\ref[src];simplemake=monkey;mob=\ref[M]'>Monkey</A> | "
body += "<A href='?src=\ref[src];simplemake=robot;mob=\ref[M]'>Cyborg</A> | "
body += "<A href='?src=\ref[src];simplemake=cat;mob=\ref[M]'>Cat</A> | "
body += "<A href='?src=\ref[src];simplemake=runtime;mob=\ref[M]'>Runtime</A> | "
body += "<A href='?src=\ref[src];simplemake=corgi;mob=\ref[M]'>Corgi</A> | "
body += "<A href='?src=\ref[src];simplemake=ian;mob=\ref[M]'>Ian</A> | "
body += "<A href='?src=\ref[src];simplemake=crab;mob=\ref[M]'>Crab</A> | "
body += "<A href='?src=\ref[src];simplemake=coffee;mob=\ref[M]'>Coffee</A> | "
//body += "<A href='?src=\ref[src];simplemake=parrot;mob=\ref[M]'>Parrot</A> | "
//body += "<A href='?src=\ref[src];simplemake=polyparrot;mob=\ref[M]'>Poly</A> | "
body += "\[ Construct: <A href='?src=\ref[src];simplemake=constructarmoured;mob=\ref[M]'>Armoured</A> , "
body += "<A href='?src=\ref[src];simplemake=constructbuilder;mob=\ref[M]'>Builder</A> , "
body += "<A href='?src=\ref[src];simplemake=constructwraith;mob=\ref[M]'>Wraith</A> \] "
body += "<A href='?src=\ref[src];simplemake=shade;mob=\ref[M]'>Shade</A>"
body += "<br>"
body += {"<br><br>
<b>Rudimentary transformation:</b><font size=2><br>These transformations only create a new mob type and copy stuff over. They do not take into account MMIs and similar mob-specific things. The buttons in 'Transformations' are preferred, when possible.</font><br>
<A href='?src=\ref[src];simplemake=observer;mob=\ref[M]'>Observer</A> |
\[ Alien: <A href='?src=\ref[src];simplemake=drone;mob=\ref[M]'>Drone</A>,
<A href='?src=\ref[src];simplemake=hunter;mob=\ref[M]'>Hunter</A>,
<A href='?src=\ref[src];simplemake=queen;mob=\ref[M]'>Queen</A>,
<A href='?src=\ref[src];simplemake=sentinel;mob=\ref[M]'>Sentinel</A>,
<A href='?src=\ref[src];simplemake=larva;mob=\ref[M]'>Larva</A> \]
<A href='?src=\ref[src];simplemake=human;mob=\ref[M]'>Human</A>
\[ slime: <A href='?src=\ref[src];simplemake=slime;mob=\ref[M]'>Baby</A>,
<A href='?src=\ref[src];simplemake=adultslime;mob=\ref[M]'>Adult</A> \]
<A href='?src=\ref[src];simplemake=monkey;mob=\ref[M]'>Monkey</A> |
<A href='?src=\ref[src];simplemake=robot;mob=\ref[M]'>Cyborg</A> |
<A href='?src=\ref[src];simplemake=cat;mob=\ref[M]'>Cat</A> |
<A href='?src=\ref[src];simplemake=runtime;mob=\ref[M]'>Runtime</A> |
<A href='?src=\ref[src];simplemake=corgi;mob=\ref[M]'>Corgi</A> |
<A href='?src=\ref[src];simplemake=ian;mob=\ref[M]'>Ian</A> |
<A href='?src=\ref[src];simplemake=crab;mob=\ref[M]'>Crab</A> |
<A href='?src=\ref[src];simplemake=coffee;mob=\ref[M]'>Coffee</A> |
\[ Construct: <A href='?src=\ref[src];simplemake=constructarmoured;mob=\ref[M]'>Armoured</A> ,
<A href='?src=\ref[src];simplemake=constructbuilder;mob=\ref[M]'>Builder</A> ,
<A href='?src=\ref[src];simplemake=constructwraith;mob=\ref[M]'>Wraith</A> \]
<A href='?src=\ref[src];simplemake=shade;mob=\ref[M]'>Shade</A>
<br>
"}
if (M.client)
body += "<br><br>"
body += "<b>Other actions:</b>"
body += "<br>"
body += "<A href='?src=\ref[src];forcespeech=\ref[M]'>Forcesay</A> | "
body += "<A href='?src=\ref[src];tdome1=\ref[M]'>Thunderdome 1</A> | "
body += "<A href='?src=\ref[src];tdome2=\ref[M]'>Thunderdome 2</A> | "
body += "<A href='?src=\ref[src];tdomeadmin=\ref[M]'>Thunderdome Admin</A> | "
body += "<A href='?src=\ref[src];tdomeobserve=\ref[M]'>Thunderdome Observer</A> | "
body += {"<br><br>
<b>Other actions:</b>
<br>
<A href='?src=\ref[src];forcespeech=\ref[M]'>Forcesay</A> |
<A href='?src=\ref[src];tdome1=\ref[M]'>Thunderdome 1</A> |
<A href='?src=\ref[src];tdome2=\ref[M]'>Thunderdome 2</A> |
<A href='?src=\ref[src];tdomeadmin=\ref[M]'>Thunderdome Admin</A> |
<A href='?src=\ref[src];tdomeobserve=\ref[M]'>Thunderdome Observer</A> |
"}
body += "<br>"
body += "</body></html>"
body += {"<br>
</body></html>
"}
usr << browse(body, "window=adminplayeropts;size=550x515")
feedback_add_details("admin_verb","SPP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -281,23 +284,29 @@ var/global/floorIsLava = 0
switch(admincaster_screen)
if(0)
dat += "Welcome to the admin newscaster.<BR> Here you can add, edit and censor every newspiece on the network."
dat += "<BR>Feed channels and stories entered through here will be uneditable and handled as official news by the rest of the units."
dat += "<BR>Note that this panel allows full freedom over the news network, there are no constrictions except the few basic ones. Don't break things!</FONT>"
dat += {"Welcome to the admin newscaster.<BR> Here you can add, edit and censor every newspiece on the network.
<BR>Feed channels and stories entered through here will be uneditable and handled as official news by the rest of the units.
<BR>Note that this panel allows full freedom over the news network, there are no constrictions except the few basic ones. Don't break things!</FONT>
"}
if(news_network.wanted_issue)
dat+= "<HR><A href='?src=\ref[src];ac_view_wanted=1'>Read Wanted Issue</A>"
dat+= "<HR><BR><A href='?src=\ref[src];ac_create_channel=1'>Create Feed Channel</A>"
dat+= "<BR><A href='?src=\ref[src];ac_view=1'>View Feed Channels</A>"
dat+= "<BR><A href='?src=\ref[src];ac_create_feed_story=1'>Submit new Feed story</A>"
dat+= "<BR><BR><A href='?src=\ref[usr];mach_close=newscaster_main'>Exit</A>"
dat+= {"<HR><BR><A href='?src=\ref[src];ac_create_channel=1'>Create Feed Channel</A>
<BR><A href='?src=\ref[src];ac_view=1'>View Feed Channels</A>
<BR><A href='?src=\ref[src];ac_create_feed_story=1'>Submit new Feed story</A>
<BR><BR><A href='?src=\ref[usr];mach_close=newscaster_main'>Exit</A>
"}
var/wanted_already = 0
if(news_network.wanted_issue)
wanted_already = 1
dat+="<HR><B>Feed Security functions:</B><BR>"
dat+="<BR><A href='?src=\ref[src];ac_menu_wanted=1'>[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue</A>"
dat+="<BR><A href='?src=\ref[src];ac_menu_censor_story=1'>Censor Feed Stories</A>"
dat+="<BR><A href='?src=\ref[src];ac_menu_censor_channel=1'>Mark Feed Channel with Nanotrasen D-Notice (disables and locks the channel.</A>"
dat+="<BR><HR><A href='?src=\ref[src];ac_set_signature=1'>The newscaster recognises you as:<BR> <FONT COLOR='green'>[src.admincaster_signature]</FONT></A>"
dat+={"<HR><B>Feed Security functions:</B><BR>
<BR><A href='?src=\ref[src];ac_menu_wanted=1'>[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue</A>
<BR><A href='?src=\ref[src];ac_menu_censor_story=1'>Censor Feed Stories</A>
<BR><A href='?src=\ref[src];ac_menu_censor_channel=1'>Mark Feed Channel with Nanotrasen D-Notice (disables and locks the channel.</A>
<BR><HR><A href='?src=\ref[src];ac_set_signature=1'>The newscaster recognises you as:<BR> <FONT COLOR='green'>[src.admincaster_signature]</FONT></A>
"}
if(1)
dat+= "Station Feed Channels<HR>"
if( isemptylist(news_network.network_channels) )
@@ -308,26 +317,36 @@ var/global/floorIsLava = 0
dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen'><A href='?src=\ref[src];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A></FONT></B><BR>"
else
dat+="<B><A href='?src=\ref[src];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR></B>"
dat+="<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A>"
dat+={"<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A>
<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A>
"}
if(2)
dat+="Creating new Feed Channel..."
dat+="<HR><B><A href='?src=\ref[src];ac_set_channel_name=1'>Channel Name</A>:</B> [src.admincaster_feed_channel.channel_name]<BR>"
dat+="<B><A href='?src=\ref[src];ac_set_signature=1'>Channel Author</A>:</B> <FONT COLOR='green'>[src.admincaster_signature]</FONT><BR>"
dat+="<B><A href='?src=\ref[src];ac_set_channel_lock=1'>Will Accept Public Feeds</A>:</B> [(src.admincaster_feed_channel.locked) ? ("NO") : ("YES")]<BR><BR>"
dat+="<BR><A href='?src=\ref[src];ac_submit_new_channel=1'>Submit</A><BR><BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A><BR>"
dat+={"
Creating new Feed Channel...
<HR><B><A href='?src=\ref[src];ac_set_channel_name=1'>Channel Name</A>:</B> [src.admincaster_feed_channel.channel_name]<BR>
<B><A href='?src=\ref[src];ac_set_signature=1'>Channel Author</A>:</B> <FONT COLOR='green'>[src.admincaster_signature]</FONT><BR>
<B><A href='?src=\ref[src];ac_set_channel_lock=1'>Will Accept Public Feeds</A>:</B> [(src.admincaster_feed_channel.locked) ? ("NO") : ("YES")]<BR><BR>
<BR><A href='?src=\ref[src];ac_submit_new_channel=1'>Submit</A><BR><BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A><BR>
"}
if(3)
dat+="Creating new Feed Message..."
dat+="<HR><B><A href='?src=\ref[src];ac_set_channel_receiving=1'>Receiving Channel</A>:</B> [src.admincaster_feed_channel.channel_name]<BR>" //MARK
dat+="<B>Message Author:</B> <FONT COLOR='green'>[src.admincaster_signature]</FONT><BR>"
dat+="<B><A href='?src=\ref[src];ac_set_new_message=1'>Message Body</A>:</B> [src.admincaster_feed_message.body] <BR>"
dat+="<BR><A href='?src=\ref[src];ac_submit_new_message=1'>Submit</A><BR><BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A><BR>"
dat+={"
Creating new Feed Message...
<HR><B><A href='?src=\ref[src];ac_set_channel_receiving=1'>Receiving Channel</A>:</B> [src.admincaster_feed_channel.channel_name]<BR>" //MARK
<B>Message Author:</B> <FONT COLOR='green'>[src.admincaster_signature]</FONT><BR>
<B><A href='?src=\ref[src];ac_set_new_message=1'>Message Body</A>:</B> [src.admincaster_feed_message.body] <BR>
<BR><A href='?src=\ref[src];ac_submit_new_message=1'>Submit</A><BR><BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A><BR>
"}
if(4)
dat+="Feed story successfully submitted to [src.admincaster_feed_channel.channel_name].<BR><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>"
dat+={"
Feed story successfully submitted to [src.admincaster_feed_channel.channel_name].<BR><BR>
<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>
"}
if(5)
dat+="Feed Channel [src.admincaster_feed_channel.channel_name] created successfully.<BR><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>"
dat+={"
Feed Channel [src.admincaster_feed_channel.channel_name] created successfully.<BR><BR>
<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>
"}
if(6)
dat+="<B><FONT COLOR='maroon'>ERROR: Could not submit Feed story to Network.</B></FONT><HR><BR>"
if(src.admincaster_feed_channel.channel_name=="")
@@ -350,8 +369,10 @@ var/global/floorIsLava = 0
if(9)
dat+="<B>[src.admincaster_feed_channel.channel_name]: </B><FONT SIZE=1>\[created by: <FONT COLOR='maroon'>[src.admincaster_feed_channel.author]</FONT>\]</FONT><HR>"
if(src.admincaster_feed_channel.censored)
dat+="<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.<BR>"
dat+="No further feed story additions are allowed while the D-Notice is in effect.</FONT><BR><BR>"
dat+={"
<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.<BR>
No further feed story additions are allowed while the D-Notice is in effect.</FONT><BR><BR>
"}
else
if( isemptylist(src.admincaster_feed_channel.messages) )
dat+="<I>No feed messages found in channel...</I><BR>"
@@ -364,13 +385,17 @@ var/global/floorIsLava = 0
usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
dat+="<img src='tmp_photo[i].png' width = '180'><BR><BR>"
dat+="<FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR>"
dat+="<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[1]'>Back</A>"
dat+={"
<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A>
<BR><A href='?src=\ref[src];ac_setScreen=[1]'>Back</A>
"}
if(10)
dat+="<B>Nanotrasen Feed Censorship Tool</B><BR>"
dat+="<FONT SIZE=1>NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.<BR>"
dat+="Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.</FONT>"
dat+="<HR>Select Feed channel to get Stories from:<BR>"
dat+={"
<B>Nanotrasen Feed Censorship Tool</B><BR>
<FONT SIZE=1>NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.<BR>
Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.</FONT>
<HR>Select Feed channel to get Stories from:<BR>
"}
if(isemptylist(news_network.network_channels))
dat+="<I>No feed channels found active...</I><BR>"
else
@@ -378,10 +403,12 @@ var/global/floorIsLava = 0
dat+="<A href='?src=\ref[src];ac_pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A>"
if(11)
dat+="<B>Nanotrasen D-Notice Handler</B><HR>"
dat+="<FONT SIZE=1>A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's"
dat+="morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed"
dat+="stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.</FONT><HR>"
dat+={"
<B>Nanotrasen D-Notice Handler</B><HR>
<FONT SIZE=1>A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's
morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed
stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.</FONT><HR>
"}
if(isemptylist(news_network.network_channels))
dat+="<I>No feed channels found active...</I><BR>"
else
@@ -390,22 +417,29 @@ var/global/floorIsLava = 0
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A>"
if(12)
dat+="<B>[src.admincaster_feed_channel.channel_name]: </B><FONT SIZE=1>\[ created by: <FONT COLOR='maroon'>[src.admincaster_feed_channel.author]</FONT> \]</FONT><BR>"
dat+="<FONT SIZE=2><A href='?src=\ref[src];ac_censor_channel_author=\ref[src.admincaster_feed_channel]'>[(src.admincaster_feed_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]</A></FONT><HR>"
dat+={"
<B>[src.admincaster_feed_channel.channel_name]: </B><FONT SIZE=1>\[ created by: <FONT COLOR='maroon'>[src.admincaster_feed_channel.author]</FONT> \]</FONT><BR>
<FONT SIZE=2><A href='?src=\ref[src];ac_censor_channel_author=\ref[src.admincaster_feed_channel]'>[(src.admincaster_feed_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]</A></FONT><HR>
"}
if( isemptylist(src.admincaster_feed_channel.messages) )
dat+="<I>No feed messages found in channel...</I><BR>"
else
for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
dat+="-[MESSAGE.body] <BR><FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR>"
dat+="<FONT SIZE=2><A href='?src=\ref[src];ac_censor_channel_story_body=\ref[MESSAGE]'>[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")]</A> - <A href='?src=\ref[src];ac_censor_channel_story_author=\ref[MESSAGE]'>[(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]</A></FONT><BR>"
dat+={"
-[MESSAGE.body] <BR><FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR>
<FONT SIZE=2><A href='?src=\ref[src];ac_censor_channel_story_body=\ref[MESSAGE]'>[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")]</A> - <A href='?src=\ref[src];ac_censor_channel_story_author=\ref[MESSAGE]'>[(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]</A></FONT><BR>
"}
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[10]'>Back</A>"
if(13)
dat+="<B>[src.admincaster_feed_channel.channel_name]: </B><FONT SIZE=1>\[ created by: <FONT COLOR='maroon'>[src.admincaster_feed_channel.author]</FONT> \]</FONT><BR>"
dat+="Channel messages listed below. If you deem them dangerous to the station, you can <A href='?src=\ref[src];ac_toggle_d_notice=\ref[src.admincaster_feed_channel]'>Bestow a D-Notice upon the channel</A>.<HR>"
dat+={"
<B>[src.admincaster_feed_channel.channel_name]: </B><FONT SIZE=1>\[ created by: <FONT COLOR='maroon'>[src.admincaster_feed_channel.author]</FONT> \]</FONT><BR>
Channel messages listed below. If you deem them dangerous to the station, you can <A href='?src=\ref[src];ac_toggle_d_notice=\ref[src.admincaster_feed_channel]'>Bestow a D-Notice upon the channel</A>.<HR>
"}
if(src.admincaster_feed_channel.censored)
dat+="<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.<BR>"
dat+="No further feed story additions are allowed while the D-Notice is in effect.</FONT><BR><BR>"
dat+={"
<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.<BR>
No further feed story additions are allowed while the D-Notice is in effect.</FONT><BR><BR>
"}
else
if( isemptylist(src.admincaster_feed_channel.messages) )
dat+="<I>No feed messages found in channel...</I><BR>"
@@ -423,9 +457,11 @@ var/global/floorIsLava = 0
end_param = 2
if(wanted_already)
dat+="<FONT SIZE=2><BR><I>A wanted issue is already in Feed Circulation. You can edit or cancel it below.</FONT></I>"
dat+="<HR>"
dat+="<A href='?src=\ref[src];ac_set_wanted_name=1'>Criminal Name</A>: [src.admincaster_feed_message.author] <BR>"
dat+="<A href='?src=\ref[src];ac_set_wanted_desc=1'>Description</A>: [src.admincaster_feed_message.body] <BR>"
dat+={"
<HR>
<A href='?src=\ref[src];ac_set_wanted_name=1'>Criminal Name</A>: [src.admincaster_feed_message.author] <BR>
<A href='?src=\ref[src];ac_set_wanted_desc=1'>Description</A>: [src.admincaster_feed_message.body] <BR>
"}
if(wanted_already)
dat+="<B>Wanted Issue created by:</B><FONT COLOR='green'> [news_network.wanted_issue.backup_author]</FONT><BR>"
else
@@ -435,8 +471,10 @@ var/global/floorIsLava = 0
dat+="<BR><A href='?src=\ref[src];ac_cancel_wanted=1'>Take down Issue</A>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A>"
if(15)
dat+="<FONT COLOR='green'>Wanted issue for [src.admincaster_feed_message.author] is now in Network Circulation.</FONT><BR><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>"
dat+={"
<FONT COLOR='green'>Wanted issue for [src.admincaster_feed_message.author] is now in Network Circulation.</FONT><BR><BR>
<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>
"}
if(16)
dat+="<B><FONT COLOR='maroon'>ERROR: Wanted Issue rejected by Network.</B></FONT><HR><BR>"
if(src.admincaster_feed_message.author =="" || src.admincaster_feed_message.author == "\[REDACTED\]")
@@ -445,13 +483,17 @@ var/global/floorIsLava = 0
dat+="<FONT COLOR='maroon'><3E>Invalid description.</FONT><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>"
if(17)
dat+="<B>Wanted Issue successfully deleted from Circulation</B><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>"
dat+={"
<B>Wanted Issue successfully deleted from Circulation</B><BR>
<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>
"}
if(18)
dat+="<B><FONT COLOR ='maroon'>-- STATIONWIDE WANTED ISSUE --</B></FONT><BR><FONT SIZE=2>\[Submitted by: <FONT COLOR='green'>[news_network.wanted_issue.backup_author]</FONT>\]</FONT><HR>"
dat+="<B>Criminal</B>: [news_network.wanted_issue.author]<BR>"
dat+="<B>Description</B>: [news_network.wanted_issue.body]<BR>"
dat+="<B>Photo:</B>: "
dat+={"
<B><FONT COLOR ='maroon'>-- STATIONWIDE WANTED ISSUE --</B></FONT><BR><FONT SIZE=2>\[Submitted by: <FONT COLOR='green'>[news_network.wanted_issue.backup_author]</FONT>\]</FONT><HR>
<B>Criminal</B>: [news_network.wanted_issue.author]<BR>
<B>Description</B>: [news_network.wanted_issue.body]<BR>
<B>Photo:</B>:
"}
if(news_network.wanted_issue.img)
usr << browse_rsc(news_network.wanted_issue.img, "tmp_photow.png")
dat+="<BR><img src='tmp_photow.png' width = '180'>"
@@ -459,8 +501,10 @@ var/global/floorIsLava = 0
dat+="None"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A><BR>"
if(19)
dat+="<FONT COLOR='green'>Wanted issue for [src.admincaster_feed_message.author] successfully edited.</FONT><BR><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>"
dat+={"
<FONT COLOR='green'>Wanted issue for [src.admincaster_feed_message.author] successfully edited.</FONT><BR><BR>
<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>
"}
else
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"

View File

@@ -6,8 +6,8 @@ var/list/admin_verbs_default = list(
/client/proc/hide_verbs, /*hides all our adminverbs*/
/client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/
/client/proc/check_antagonists, /*shows all antags*/
/client/proc/deadchat /*toggles deadchat on/off*/
/client/proc/check_antagonists /*shows all antags*/
// /client/proc/deadchat /*toggles deadchat on/off*/
)
var/list/admin_verbs_admin = list(
/client/proc/player_panel, /*shows an interface for all players, with links to various panels (old style)*/
@@ -156,7 +156,7 @@ var/list/admin_verbs_rejuv = list(
var/list/admin_verbs_hideable = list(
/client/proc/set_ooc,
/client/proc/deadmin_self,
/client/proc/deadchat,
// /client/proc/deadchat,
/client/proc/toggleprayers,
/client/proc/toggle_hear_radio,
/datum/admins/proc/show_traitor_panel,

View File

@@ -469,6 +469,13 @@
dat += "<tr><td><i>Wizard not found!</i></td></tr>"
dat += "</table>"
if(ticker.mode.raiders.len > 0)
for(var/datum/mind/raider in ticker.mode.raiders)
var/mob/M = raider.current
if(M)
dat += "<tr><td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(logged out)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>"
dat += "<td><A HREF='?src=\ref[src];traitor=\ref[M]'>Show Objective</A></td></tr>"
/*
if(ticker.mode.ninjas.len > 0)
dat += "<br><table cellspacing=5><tr><td><B>Ninjas</B></td><td></td><td></td></tr>"

View File

@@ -11,6 +11,10 @@
src << "\red You cannot send DSAY messages (muted)."
return
if(!(prefs.toggles & CHAT_DEAD))
src << "\red You have deadchat muted."
return
if (src.handle_spam_prevention(msg,MUTE_DEADCHAT))
return
@@ -25,7 +29,11 @@
for (var/mob/M in player_list)
if (istype(M, /mob/new_player))
continue
if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
if(M.client && M.client.holder && (M.client.prefs.toggles & CHAT_DEAD)) // show the message to admins who have deadchat toggled on
M.show_message(rendered, 2)
else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // show the message to regular ghosts who have deadchat toggled on
M.show_message(rendered, 2)
feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!

View File

@@ -62,7 +62,7 @@
*/
/client/proc/fix_next_move()
set category = "Debug"
/* set category = "Debug"
set name = "Unfreeze Everyone"
var/largest_move_time = 0
var/largest_click_time = 0
@@ -90,6 +90,7 @@
message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [largest_click_time/10] seconds!", 1)
message_admins("world.time = [world.time]", 1)
feedback_add_details("admin_verb","UFE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
*/
return
/client/proc/radio_report()

View File

@@ -444,16 +444,15 @@ client/proc/one_click_antag()
//Generates a list of candidates from active ghosts.
for(var/mob/dead/observer/G in player_list)
spawn(0)
if(is_alien_whitelisted(G, "Vox") || !config.usealienwhitelist)
switch(alert(G,"Do you wish to be considered for a vox raiding party arriving on the station?","Please answer in 30 seconds!","Yes","No"))
if("Yes")
if((world.time-time_passed)>300)//If more than 30 game seconds passed.
return
candidates += G
if("No")
return
else
switch(alert(G,"Do you wish to be considered for a vox raiding party arriving on the station?","Please answer in 30 seconds!","Yes","No"))
if("Yes")
if((world.time-time_passed)>300)//If more than 30 game seconds passed.
return
candidates += G
if("No")
return
else
return
sleep(300) //Debug.
@@ -462,11 +461,11 @@ client/proc/one_click_antag()
candidates.Remove(G)
if(candidates.len)
var/max_raiders = 4
var/max_raiders = 1
var/raiders = max_raiders
//Spawns vox raiders and equips them.
for (var/obj/effect/landmark/L in world)
if(L.name == "Response Team")
if(L.name == "voxstart")
if(raiders<=0)
break
@@ -507,13 +506,14 @@ client/proc/one_click_antag()
i++
newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah"))
new_vox.vox_talk_understand = 1
new_vox.real_name = capitalize(newname)
new_vox.name = new_vox.real_name
new_vox.age = rand(12,20)
new_vox.dna.ready_dna(new_vox) // Creates DNA.
new_vox.dna.mutantrace = "vox" // Actually makes the vox! How about that.
new_vox.dna.mutantrace = "vox"
new_vox.set_species("Vox") // Actually makes the vox! How about that.
new_vox.add_language("Vox-pidgin")
new_vox.mind_initialize()
new_vox.mind.assigned_role = "MODE"
new_vox.mind.special_role = "Vox Raider"

View File

@@ -18,26 +18,6 @@ var/global/vox_tick = 1
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
equip_to_slot_or_del(new /obj/item/device/chameleon(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/gun/dartgun/vox/raider, slot_r_hand)
if(2) // Vox engineer!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/pressure(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/pressure(src), slot_head)
equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(src), slot_belt)
equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
equip_to_slot_or_del(new /obj/item/weapon/storage/box/emps(src), slot_l_store)
var/obj/item/weapon/storage/pneumatic/W = new(src)
W.tank = new /obj/item/weapon/tank/nitrogen(W)
equip_to_slot_or_del(W, slot_r_hand)
if(3) // Vox saboteur!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(src), slot_head)
equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(src), slot_belt)
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
equip_to_slot_or_del(new /obj/item/weapon/card/emag(src), slot_l_store)
var/obj/item/weapon/crossbow/W = new(src)
W.cell = new /obj/item/weapon/cell/crap(W)
W.cell.charge = 500
@@ -47,6 +27,24 @@ var/global/vox_tick = 1
A.amount = 20
equip_to_slot_or_del(A, slot_l_hand)
if(2) // Vox engineer!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/pressure(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/pressure(src), slot_head)
equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(src), slot_belt)
equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
equip_to_slot_or_del(new /obj/item/weapon/storage/box/emps(src), slot_r_hand)
equip_to_slot_or_del(new /obj/item/device/multitool(src), slot_l_hand)
if(3) // Vox saboteur!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/carapace(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/carapace(src), slot_head)
equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(src), slot_belt)
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE.
equip_to_slot_or_del(new /obj/item/weapon/card/emag(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/gun/dartgun/vox/raider(src), slot_r_hand)
equip_to_slot_or_del(new /obj/item/device/multitool(src), slot_l_hand)
if(4) // Vox medic!
equip_to_slot_or_del(new /obj/item/clothing/suit/space/vox/pressure(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/vox/pressure(src), slot_head)
@@ -67,6 +65,17 @@ var/global/vox_tick = 1
W.registered_name = real_name
equip_to_slot_or_del(W, slot_wear_id)
var/obj/item/weapon/implant/cortical/I = new(src)
I.imp_in = src
I.implanted = 1
var/datum/organ/external/affected = src.get_organ("head")
affected.implants += I
I.part = affected
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/heist ) ) )
var/datum/game_mode/heist/M = ticker.mode
M.cortical_stacks += I
vox_tick++
if (vox_tick > 4) vox_tick = 1

View File

@@ -15,6 +15,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"cultist" = IS_MODE_COMPILED("cult"), // 8
"infested monkey" = IS_MODE_COMPILED("monkey"), // 9
"ninja" = "true", // 10
"vox raider" = IS_MODE_COMPILED("heist"), // 11
)
var/const/MAX_SAVE_SLOTS = 10
@@ -99,6 +100,7 @@ datum/preferences
var/flavor_text = ""
var/med_record = ""
var/sec_record = ""
var/gen_record = ""
var/disabilities = 0
var/nanotrasen_relation = "Neutral"
@@ -492,6 +494,13 @@ datum/preferences
else
HTML += "[copytext(med_record, 1, 37)]..."
HTML += "<br><br><a href=\"byond://?src=\ref[user];preference=records;task=gen_record\">Employment Records</a><br>"
if(lentext(gen_record) <= 40)
HTML += "[gen_record]"
else
HTML += "[copytext(gen_record, 1, 37)]..."
HTML += "<br><br><a href=\"byond://?src=\ref[user];preference=records;task=sec_record\">Security Records</a><br>"
if(lentext(sec_record) <= 40)
@@ -732,6 +741,15 @@ datum/preferences
sec_record = secmsg
SetRecords(user)
if(href_list["task"] == "gen_record")
var/genmsg = input(usr,"Set your employment notes here.","Employment Records",html_decode(gen_record)) as message
if(genmsg != null)
genmsg = copytext(genmsg, 1, MAX_PAPER_MESSAGE_LEN)
genmsg = html_encode(genmsg)
gen_record = genmsg
SetRecords(user)
switch(href_list["task"])
if("random")
@@ -781,31 +799,21 @@ datum/preferences
if(new_age)
age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
if("species")
var/list/new_species = list("Human")
var/prev_species = species
var/whitelisted = 0
if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
if(is_alien_whitelisted(user, "Soghun")) //Check for Unathi and admins
new_species += "Unathi"
whitelisted = 1
if(is_alien_whitelisted(user, "Tajaran")) //Check for Tajaran and admins
new_species += "Tajaran"
whitelisted = 1
if(is_alien_whitelisted(user, "Skrell")) //Check for Skrell and admins
new_species += "Skrell"
whitelisted = 1
if(is_alien_whitelisted(user, "Vox")) //Check for Skrell and admins
new_species += "Vox"
whitelisted = 1
for(var/S in whitelisted_species)
if(is_alien_whitelisted(user,S))
new_species += S
whitelisted = 1
if(!whitelisted)
alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.")
else //Not using the whitelist? Aliens for everyone!
new_species += "Tajaran"
new_species += "Unathi"
new_species += "Skrell"
new_species += "Vox"
new_species = whitelisted_species
species = input("Please select a species", "Character Generation", null) in new_species
if(prev_species != species)
@@ -854,31 +862,21 @@ datum/preferences
s_tone = 0
if("language")
var/list/new_language = list("None")
var/list/new_languages = list("None")
var/language_whitelisted = 0
if(config.usealienwhitelist)
if(is_alien_whitelisted(user, "Language_Soghun"))
new_language += "Unathi"
language_whitelisted = 1
if(is_alien_whitelisted(user, "Language_Tajaran"))
new_language += "Tajaran"
language_whitelisted = 1
if(is_alien_whitelisted(user, "Language_Skrell"))
new_language += "Skrell"
language_whitelisted = 1
if(is_alien_whitelisted(user, "Language_Kidan"))
new_language += "Kidan"
language_whitelisted = 1
if(!language_whitelisted)
alert(user, "You cannot select a secondary language as you need to be whitelisted. If you wish to enable a language, post in the Alien Whitelist forums.")
for(var/L in all_languages)
if(is_alien_whitelisted(user, L))
new_languages += L
language_whitelisted = 1
else
new_language += "Unathi"
new_language += "Tajaran"
new_language += "Skrell"
new_language += "Kidan"
language = input("Please select a secondary language", "Character Generation", null) in new_language
for(var/L in all_languages)
new_languages += L
if(!language_whitelisted)
alert(user, "You cannot select a secondary language as you need to be whitelisted. If you wish to enable a language, post in the Alien Whitelist forums.")
language = input("Please select a secondary language", "Character Generation", null) in new_languages
if("metadata")
var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null
@@ -1118,7 +1116,7 @@ datum/preferences
proc/copy_to(mob/living/carbon/human/character, safety = 0)
if(be_random_name)
real_name = random_name()
real_name = random_name(gender)
if(config.humans_need_surnames)
var/firstspace = findtext(real_name, " ")
@@ -1136,6 +1134,7 @@ datum/preferences
character.flavor_text = flavor_text
character.med_record = med_record
character.sec_record = sec_record
character.gen_record = gen_record
character.gender = gender
character.age = age

View File

@@ -138,6 +138,7 @@
S["flavor_text"] >> flavor_text
S["med_record"] >> med_record
S["sec_record"] >> sec_record
S["gen_record"] >> gen_record
S["be_special"] >> be_special
S["disabilities"] >> disabilities
S["player_alt_titles"] >> player_alt_titles
@@ -155,7 +156,7 @@
if(isnull(species)) species = "Human"
if(isnull(language)) language = "None"
if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation)
if(!real_name) real_name = random_name()
if(!real_name) real_name = random_name(gender)
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
gender = sanitize_gender(gender)
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
@@ -241,6 +242,7 @@
S["flavor_text"] << flavor_text
S["med_record"] << med_record
S["sec_record"] << sec_record
S["gen_record"] << gen_record
S["player_alt_titles"] << player_alt_titles
S["be_special"] << be_special
S["disabilities"] << disabilities

View File

@@ -37,13 +37,18 @@
usr << "You will [(prefs.toggles & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive."
feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/deadchat()
/client/verb/deadchat() // Deadchat toggle is usable by anyone.
set name = "Show/Hide Deadchat"
set category = "Preferences"
set desc ="Toggles seeing deadchat"
prefs.toggles ^= CHAT_DEAD
prefs.save_preferences()
src << "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat."
if(src.holder)
src << "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat."
else
src << "As a ghost, you will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat."
feedback_add_details("admin_verb","TDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggleprayers()

View File

@@ -53,7 +53,7 @@
/obj/item/clothing/mask/breath/vox/mob_can_equip(M as mob, slot)
var/mob/living/carbon/human/V = M
if(V.dna.mutantrace != "vox")
if(V.species.name != "Vox")
V << "<span class='warning'>This clearly isn't designed for your species!</span>"
return 0

View File

@@ -3,14 +3,14 @@
var/up = 0 //So Unathi helmets play nicely with the weldervision check.
mob_can_equip(M as mob, slot)
var/mob/living/carbon/human/U = M
if(U.dna.mutantrace != "lizard")
if(U.species.name != "Unathi")
U << "<span class='warning'>This clearly isn't designed for your species!</span>"
return 0
return ..()
/obj/item/clothing/suit/space/unathi/mob_can_equip(M as mob, slot)
var/mob/living/carbon/human/U = M
if(U.dna.mutantrace != "lizard")
if(U.species.name != "Unathi")
U << "<span class='warning'>This clearly isn't designed for your species!</span>"
return 0
@@ -79,19 +79,22 @@
/obj/item/clothing/head/helmet/space/vox/mob_can_equip(M as mob, slot)
var/mob/living/carbon/human/V = M
if(V.dna.mutantrace != "vox")
if(V.species.name != "Vox")
V << "<span class='warning'>This clearly isn't designed for your species!</span>"
return 0
return ..()
/obj/item/clothing/suit/space/vox/mob_can_equip(M as mob, slot)
var/mob/living/carbon/human/V = M
if(V.dna.mutantrace != "vox")
if(V.species.name != "Vox")
V << "<span class='warning'>This clearly isn't designed for your species!</span>"
return 0
return ..()
/obj/item/clothing/under/vox
has_sensor = 0
/obj/item/clothing/under/vox/vox_casual
name = "alien clothing"
desc = "This doesn't look very comfortable."
@@ -117,7 +120,7 @@
/obj/item/clothing/gloves/yellow/vox/mob_can_equip(M as mob, slot)
var/mob/living/carbon/human/U = M
if(U.dna.mutantrace != "vox")
if(U.species.name != "Vox")
U << "<span class='warning'>This clearly isn't designed for your species!</span>"
return 0
return ..()
@@ -149,7 +152,7 @@
/obj/item/clothing/shoes/magboots/vox/mob_can_equip(M as mob, slot)
var/mob/living/carbon/human/U = M
if(U.dna.mutantrace != "vox")
if(U.species.name != "Vox")
U << "<span class='warning'>This clearly isn't designed for your species!</span>"
return 0
return ..()

View File

@@ -1,14 +1,30 @@
/obj/item/clothing/head/helmet/space/ert
/obj/item/clothing/head/helmet/space/rig/ert
name = "emergency response team helmet"
desc = "A helmet worn by members of the NanoTrasen Emergency Response Team. Armoured and space ready."
icon_state = "ert_commander"
icon_state = "rig0-ert_commander"
item_state = "helm-command"
armor = list(melee = 50, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 60)
siemens_coefficient = 0.6
var/obj/machinery/camera/camera
/obj/item/clothing/suit/space/ert
/obj/item/clothing/head/helmet/space/rig/ert/attack_self(mob/user)
if(camera)
..(user)
else
camera = new /obj/machinery/camera(src)
camera.network = list("ERT")
cameranet.removeCamera(camera)
camera.c_tag = user.name
user << "\blue User scanned as [camera.c_tag]. Camera activated."
/obj/item/clothing/head/helmet/space/rig/ert/examine()
..()
if(get_dist(usr,src) <= 1)
usr << "This helmet has a built-in camera. It's [camera ? "" : "in"]active."
/obj/item/clothing/suit/space/rig/ert
name = "emergency response team suit"
desc = "A suit worn by members of the NanoTrasen Emergency Response Team. Armoured, space ready, and fire resistant."
desc = "A suit worn by members of the NanoTrasen Emaergency Response Team. Armoured, space ready, and fire resistant."
icon_state = "ert_commander"
item_state = "suit-command"
w_class = 3
@@ -22,49 +38,53 @@
siemens_coefficient = 0.6
//Commander
/obj/item/clothing/head/helmet/space/ert/commander
/obj/item/clothing/head/helmet/space/rig/ert/commander
name = "emergency response team commander helmet"
desc = "A helmet worn by the commander of a NanoTrasen Emergency Response Team. Has blue highlights. Armoured and space ready."
icon_state = "ert_commander"
icon_state = "rig0-ert_commander"
item_state = "helm-command"
color = "ert_commander"
/obj/item/clothing/suit/space/ert/commander
/obj/item/clothing/suit/space/rig/ert/commander
name = "emergency response team commander suit"
desc = "A suit worn by the commander of a NanoTrasen Emergency Response Team. Has blue highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_commander"
item_state = "suit-command"
//Security
/obj/item/clothing/head/helmet/space/ert/security
/obj/item/clothing/head/helmet/space/rig/ert/security
name = "emergency response team security helmet"
desc = "A helmet worn by security members of a NanoTrasen Emergency Response Team. Has red highlights. Armoured and space ready."
icon_state = "ert_security"
icon_state = "rig0-ert_security"
item_state = "syndicate-helm-black-red"
color = "ert_security"
/obj/item/clothing/suit/space/ert/security
/obj/item/clothing/suit/space/rig/ert/security
name = "emergency response team security suit"
desc = "A suit worn by security members of a NanoTrasen Emergency Response Team. Has red highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_security"
item_state = "syndicate-black-red"
//Engineer
/obj/item/clothing/head/helmet/space/ert/engineer
/obj/item/clothing/head/helmet/space/rig/ert/engineer
name = "emergency response team engineer helmet"
desc = "A helmet worn by engineering members of a NanoTrasen Emergency Response Team. Has blue highlights. Armoured and space ready."
icon_state = "ert_engineer"
icon_state = "rig0-ert_engineer"
color = "ert_engineer"
/obj/item/clothing/suit/space/ert/engineer
/obj/item/clothing/suit/space/rig/ert/engineer
name = "emergency response team engineer suit"
desc = "A suit worn by the engineering of a NanoTrasen Emergency Response Team. Has blue highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_engineer"
//Medical
/obj/item/clothing/head/helmet/space/ert/medical
/obj/item/clothing/head/helmet/space/rig/ert/medical
name = "emergency response team medical helmet"
desc = "A helmet worn by medical members of a NanoTrasen Emergency Response Team. Has white highlights. Armoured and space ready."
icon_state = "ert_medical"
icon_state = "rig0-ert_medical"
color = "ert_medical"
/obj/item/clothing/suit/space/ert/medical
/obj/item/clothing/suit/space/rig/ert/medical
name = "emergency response team medical suit"
desc = "A suit worn by medical members of a NanoTrasen Emergency Response Team. Has white highlights. Armoured and space ready."
icon_state = "ert_medical"

View File

@@ -87,7 +87,22 @@
color = "syndi"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60)
siemens_coefficient = 0.6
var/obj/machinery/camera/camera
/obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user)
if(camera)
..(user)
else
camera = new /obj/machinery/camera(src)
camera.network = list("NUKE")
cameranet.removeCamera(camera)
camera.c_tag = user.name
user << "\blue User scanned as [camera.c_tag]. Camera activated."
/obj/item/clothing/head/helmet/space/rig/syndi/examine()
..()
if(get_dist(usr,src) <= 1)
usr << "This helmet has a built-in camera. It's [camera ? "" : "in"]active."
/obj/item/clothing/suit/space/rig/syndi
icon_state = "rig-syndi"

View File

@@ -103,9 +103,8 @@
icon_state = "hazard"
item_state = "hazard"
blood_overlay_type = "armor"
allowed = list (/obj/item/device/analyzer, /obj/item/device/flashlight, /obj/item/device/multitool, /obj/item/device/radio, /obj/item/device/t_scanner, \
/obj/item/weapon/crowbar, /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, \
/obj/item/weapon/tank/emergency_oxygen)
allowed = list (/obj/item/device/analyzer, /obj/item/device/flashlight, /obj/item/device/multitool, /obj/item/device/pipe_painter, /obj/item/device/radio, /obj/item/device/t_scanner, \
/obj/item/weapon/crowbar, /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/weapon/tank/emergency_oxygen)
//Lawyer
/obj/item/clothing/suit/storage/lawyer/bluejacket

View File

@@ -176,7 +176,7 @@
color = "holster_low"
/obj/item/clothing/tie/storage
name = "load beearing equipment"
name = "load bearing equipment"
desc = "Used to hold things when you don't have enough hands for that."
icon_state = "webbing"
color = "webbing"
@@ -201,7 +201,7 @@
src.add_fingerprint(user)
/obj/item/weapon/storage/pockets
name = "webbing pockets"
name = "storage"
var/master_item //item it belongs to
/obj/item/weapon/storage/pockets/close(mob/user as mob)
@@ -222,7 +222,7 @@
slots = 5
/obj/item/clothing/tie/storage/brown_vest
name = "black webbing vest"
name = "brown webbing vest"
desc = "Worn brownish synthcotton vest with lots of pockets to unload your hands."
icon_state = "vest_brown"
color = "vest_brown"
@@ -302,4 +302,36 @@
new /obj/item/clothing/tie/holobadge/cord(src)
new /obj/item/clothing/tie/holobadge/cord(src)
..()
return
return
/obj/item/clothing/tie/storage/knifeharness
name = "decorated harness"
desc = "A heavily decorated harness of sinew and leather with two knife-loops."
icon_state = "unathiharness2"
color = "unathiharness2"
slots = 2
/obj/item/clothing/tie/storage/knifeharness/attackby(var/obj/item/O as obj, mob/user as mob)
..()
update()
/obj/item/clothing/tie/storage/knifeharness/proc/update()
var/count = 0
for(var/obj/item/I in hold)
if(istype(I,/obj/item/weapon/hatchet/unathiknife))
count++
if(count>2) count = 2
item_state = "unathiharness[count]"
icon_state = item_state
color = item_state
if(istype(loc, /obj/item/clothing))
var/obj/item/clothing/U = loc
if(istype(U.loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = U.loc
H.update_inv_w_uniform()
/obj/item/clothing/tie/storage/knifeharness/New()
..()
new /obj/item/weapon/hatchet/unathiknife(hold)
new /obj/item/weapon/hatchet/unathiknife(hold)

View File

@@ -10,10 +10,14 @@
spawn()
world << sound('sound/AI/radiation.ogg')
command_alert("High levels of radiation detected near the station. Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert")
make_maint_all_access()
sleep(600)
command_alert("The station has entered the radiation belt. Please remain in a sheltered area until we have passed the radiation belt.", "Anomaly Alert")
for(var/i = 0, i < 10, i++)
for(var/mob/living/carbon/human/H in living_mob_list)
var/turf/T = get_turf(H)
@@ -23,16 +27,19 @@
continue
if(istype(T.loc, /area/maintenance) || istype(T.loc, /area/crew_quarters))
continue
if(istype(H,/mob/living/carbon/human))
H.apply_effect((rand(2,15)),IRRADIATE,0)
H.apply_effect((rand(15,35)),IRRADIATE,0)
if(prob(5))
H.apply_effect((rand(10,30)),IRRADIATE,0)
H.apply_effect((rand(40,70)),IRRADIATE,0)
if (prob(75))
randmutb(H)
randmutb(H) // Applies bad mutation
domutcheck(H,null,1)
else
randmutg(H)
randmutg(H) // Applies good mutation
domutcheck(H,null,1)
for(var/mob/living/carbon/monkey/M in living_mob_list)
var/turf/T = get_turf(M)
if(!T)
@@ -43,4 +50,10 @@
sleep(100)
command_alert("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms.", "Anomaly Alert")
command_alert("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert")
sleep(600) // Want to give them time to get out of maintenance.
revoke_maint_all_access()

View File

@@ -18,7 +18,15 @@
else
del(src)
/obj/machinery/mineral/processing_unit_console/attack_hand(user as mob)
/obj/machinery/mineral/processing_unit_console/process()
updateDialog()
/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user)
add_fingerprint(user)
interact(user)
/obj/machinery/mineral/processing_unit_console/interact(mob/user)
user.set_machine(src)
var/dat = "<b>Smelter control console</b><br><br>"
//iron
@@ -114,7 +122,7 @@
user << browse("[dat]", "window=console_processing_unit")
onclose(user, "console_processing_unit")
/obj/machinery/mineral/processing_unit_console/Topic(href, href_list)

View File

@@ -18,7 +18,15 @@
else
del(src)
/obj/machinery/mineral/stacking_unit_console/attack_hand(user as mob)
/obj/machinery/mineral/stacking_unit_console/process()
updateDialog()
/obj/machinery/mineral/stacking_unit_console/attack_hand(mob/user)
add_fingerprint(user)
interact(user)
/obj/machinery/mineral/stacking_unit_console/interact(mob/user)
user.set_machine(src)
var/dat
@@ -60,6 +68,7 @@
dat += text("<br>Stacking: [machine.stack_amt]<br><br>")
user << browse("[dat]", "window=console_stacking_machine")
onclose(user, "console_stacking_machine")
/obj/machinery/mineral/stacking_unit_console/Topic(href, href_list)
if(..())

View File

@@ -132,10 +132,10 @@ proc/move_mining_shuttle()
usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["move"])
if(ticker.mode.name == "blob")
if(ticker.mode:declared)
usr << "Under directive 7-10, [station_name()] is quarantined until further notice."
return
//if(ticker.mode.name == "blob")
// if(ticker.mode:declared)
// usr << "Under directive 7-10, [station_name()] is quarantined until further notice."
// return
if (!mining_shuttle_moving)
usr << "\blue Shuttle recieved message and will be sent shortly."

View File

@@ -598,12 +598,10 @@ commented out in r5061, I left it because of the shroom thingies
if(istype(R.module_active,/obj/item/weapon/pickaxe))
src.attackby(R.module_active,R)
return
/* else if(istype(AM,/obj/mecha))
else if(istype(AM,/obj/mecha))
var/obj/mecha/M = AM
if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill))
src.attackby(M.selected,M)
return*/
//Aparantly mechs are just TOO COOL to call Bump(), so fuck em (for now)
M.selected.action(src)
else
return

View File

@@ -286,3 +286,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(host)
host.ckey = src.ckey
host << "<span class='info'>You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.</span>"
/mob/dead/observer/verb/view_manfiest()
set name = "View Crew Manifest"
set category = "Ghost"
var/dat
dat += "<h4>Crew Manifest</h4>"
dat += data_core.get_manifest()
src << browse(dat, "window=manifest;size=370x420;can_close=1")

View File

@@ -18,6 +18,29 @@
return
. = src.say_dead(message)
/mob/dead/observer/emote(var/act, var/type, var/message)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if(!message)
return
if(act != "me")
return
log_emote("Ghost/[src.key] : [message]")
if(src.client)
if(src.client.prefs.muted & MUTE_DEADCHAT)
src << "\red You cannot emote in deadchat (muted)."
return
if(src.client.handle_spam_prevention(message, MUTE_DEADCHAT))
return
. = src.emote_dead(message)
/*
for (var/mob/M in hearers(null, null))
if (!M.stat)

View File

@@ -1,5 +1,5 @@
// All mobs should have custom emote, really..
mob/proc/custom_emote(var/m_type=1,var/message = null)
/mob/proc/custom_emote(var/m_type=1,var/message = null)
if(!use_me && usr == src)
usr << "You are unable to emote."
@@ -25,7 +25,7 @@ mob/proc/custom_emote(var/m_type=1,var/message = null)
//Hearing gasp and such every five seconds is not good emotes were not global for a reason.
// Maybe some people are okay with that.
for(var/mob/M in world)
for(var/mob/M in player_list)
if (!M.client)
continue //skip monkeys and leavers
if (istype(M, /mob/new_player))
@@ -42,3 +42,38 @@ mob/proc/custom_emote(var/m_type=1,var/message = null)
else if (m_type & 2)
for (var/mob/O in hearers(src.loc, null))
O.show_message(message, m_type)
/mob/proc/emote_dead(var/message)
if(client.prefs.muted & MUTE_DEADCHAT)
src << "\red You cannot send deadchat emotes (muted)."
return
if(!(client.prefs.toggles & CHAT_DEAD))
src << "\red You have deadchat muted."
return
var/input
if(!message)
input = copytext(sanitize(input(src, "Choose an emote to display.") as text|null), 1, MAX_MESSAGE_LEN)
else
input = message
if(input)
message = "<span class='game deadsay'><span class='prefix'>DEAD:</span> <b>[src]</b> [message]</span>"
else
return
if(message)
log_emote("Ghost/[src.key] : [message]")
for(var/mob/M in player_list)
if(istype(M, /mob/new_player))
continue
if(M.client && M.client.holder && (M.client.holder.rights & R_ADMIN|R_MOD) && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to admins/mods
M << message
else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to regular ghosts with deadchat toggled on
M.show_message(message, 2)

View File

@@ -0,0 +1,58 @@
/*
Datum based languages. Easily editable and modular.
*/
/datum/language
var/name = "name" // Fluff name of language if any.
var/speech_verb // 'says', 'hisses', 'farts'.
var/colour // CSS style to use for strings in this language.
var/key // Character used to speak in language eg. :o for Unathi.
/datum/language/unathi
name = "Sinta'unathi"
speech_verb = "hisses"
colour = "soghun"
key = "o"
/datum/language/tajaran
name = "Siik'mas"
speech_verb = "mrowls"
colour = "tajaran"
key = "j"
/datum/language/skrell
name = "Skrellian"
speech_verb = "warbles"
colour = "skrell"
key = "k"
/datum/language/vox
name = "Vox-pidgin"
speech_verb = "shrieks"
colour = "vox"
key = "v"
// Language handling.
/mob/proc/add_language(var/language)
for(var/datum/language/L in languages)
if(L && L.name == language)
return 0
var/datum/language/new_language = all_languages[language]
if(!istype(new_language,/datum/language))
return 0
languages += new_language
return 1
/mob/proc/remove_language(var/rem_language)
for(var/datum/language/L in languages)
if(L && L.name == rem_language)
languages -= L
return 1
return 0

View File

@@ -54,6 +54,34 @@
dizziness = 0
jitteriness = 0
//Handle brain slugs.
var/datum/organ/external/head = get_organ("head")
var/mob/living/simple_animal/borer/B
for(var/I in head.implants)
if(istype(I,/mob/living/simple_animal/borer))
B = I
if(B)
if(!B.ckey && ckey && B.controlling)
B.ckey = ckey
B.controlling = 0
if(B.host_brain.ckey)
ckey = B.host_brain.ckey
B.host_brain.ckey = null
B.host_brain.name = "host brain"
B.host_brain.real_name = "host brain"
verbs -= /mob/living/carbon/human/proc/release_control
//Check for heist mode kill count.
if(ticker.mode && ( istype( ticker.mode,/datum/game_mode/heist) ) )
//Check for last assailant's mutantrace.
/*if( LAssailant && ( istype( LAssailant,/mob/living/carbon/human ) ) )
var/mob/living/carbon/human/V = LAssailant
if (V.dna && (V.dna.mutantrace == "vox"))*/ //Not currently feasible due to terrible LAssailant tracking.
//world << "Vox kills: [vox_kills]"
vox_kills++ //Bad vox. Shouldn't be killing humans.
if(!gibbed)
emote("deathgasp") //let the world KNOW WE ARE DEAD

View File

@@ -190,6 +190,12 @@
else if(jitteriness >= 100)
msg += "<span class='warning'>[t_He] [t_is] twitching ever so slightly.</span>\n"
//splints
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
var/datum/organ/external/o = get_organ(organ)
if(o && o.status & ORGAN_SPLINTED)
msg += "<span class='warning'>[t_He] [t_has] a splint on his [o.display_name]!</span>\n"
if(suiciding)
msg += "<span class='warning'>[t_He] appears to have commited suicide... there is no hope of recovery.</span>\n"

View File

@@ -5,15 +5,46 @@
icon = 'icons/mob/human.dmi'
icon_state = "body_m_s"
var/list/hud_list = list()
var/datum/species/species //Contains icon generation and language information, set during New().
/mob/living/carbon/human/dummy
real_name = "Test Dummy"
status_flags = GODMODE|CANPUSH
/mob/living/carbon/human/skrell/New()
h_style = "Skrell Male Tentacles"
set_species("Skrell")
..()
/mob/living/carbon/human/tajaran/New()
h_style = "Tajaran Ears"
set_species("Tajaran")
..()
/mob/living/carbon/human/unathi/New()
h_style = "Unathi Horns"
set_species("Unathi")
..()
/mob/living/carbon/human/vox/New()
h_style = "Short Vox Quills"
set_species("Vox")
..()
/mob/living/carbon/human/diona/New()
species = new /datum/species/diona(src)
..()
/mob/living/carbon/human/New()
if(!species)
set_species()
if(species.language)
var/datum/language/L = all_languages[species.language]
if(L)
languages += L
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
@@ -379,6 +410,7 @@
<BR>[(handcuffed ? text("<A href='?src=\ref[src];item=handcuff'>Handcuffed</A>") : text("<A href='?src=\ref[src];item=handcuff'>Not Handcuffed</A>"))]
<BR>[(legcuffed ? text("<A href='?src=\ref[src];item=legcuff'>Legcuffed</A>") : text(""))]
<BR>[(internal ? text("<A href='?src=\ref[src];item=internal'>Remove Internal</A>") : "")]
<BR><A href='?src=\ref[src];item=splints'>Remove Splints</A>
<BR><A href='?src=\ref[src];item=pockets'>Empty Pockets</A>
<BR><A href='?src=\ref[user];refresh=1'>Refresh</A>
<BR><A href='?src=\ref[user];mach_close=mob[name]'>Close</A>
@@ -794,44 +826,14 @@
return
/mob/living/carbon/human/get_species()
if(dna)
switch(dna.mutantrace)
if("lizard")
return "Unathi"
if("tajaran")
return "Tajaran"
if("skrell")
return "Skrell"
if("vox")
return "Vox"
if("plant")
return "Mobile vegetation"
if("golem")
return "Animated Construct"
else
return "Human"
/mob/living/carbon/get_species()
if(src.dna)
if(src.dna.mutantrace == "lizard")
return "Unathi"
else if(src.dna.mutantrace == "skrell")
return "Skrell"
else if(src.dna.mutantrace == "tajaran")
return "Tajaran"
else if(src.dna.mutantrace == "vox")
return "vox"
if(!species)
set_species()
/mob/living/carbon/proc/update_mutantrace_languages()
if(src.dna)
if(src.dna.mutantrace == "lizard")
src.soghun_talk_understand = 1
else if(src.dna.mutantrace == "skrell")
src.skrell_talk_understand = 1
else if(src.dna.mutantrace == "tajaran")
src.tajaran_talk_understand = 1
else if(src.dna.mutantrace == "vox")
src.vox_talk_understand = 1
if(dna && dna.mutantrace == "golem")
return "Animated Construct"
return species.name
/mob/living/carbon/human/proc/play_xylophone()
if(!src.xylophone)
@@ -1119,9 +1121,9 @@ mob/living/carbon/human/yank_out_object()
set desc = "Remove an embedded item at the cost of bleeding and pain."
set src in view(1)
if(!isliving(usr) || usr.next_move > world.time)
if(!isliving(usr) || usr.last_click + usr.click_delay > world.time)
return
usr.next_move = world.time + 20
usr.delay_click(20)
if(usr.stat == 1)
usr << "You are unconcious and cannot do that!"
@@ -1202,6 +1204,8 @@ mob/living/carbon/human/yank_out_object()
/mob/living/carbon/human/proc/handle_embedded_objects()
for(var/datum/organ/external/organ in src.organs)
if(organ.status & ORGAN_SPLINTED) //Splints prevent movement.
continue
for(var/obj/item/weapon/O in organ.implants)
if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad.
// All kinds of embedded objects cause bleeding.
@@ -1215,9 +1219,10 @@ mob/living/carbon/human/yank_out_object()
msg ="<span class='warning'>[O] in your [organ.display_name] twists painfully as you move.</span>"
src << msg
organ.status |= ORGAN_BLEEDING
organ.take_damage(rand(1,3), 0, 0)
src.adjustToxLoss(rand(1,3))
if(!(organ.status & ORGAN_ROBOT)) //There is no blood in protheses.
organ.status |= ORGAN_BLEEDING
src.adjustToxLoss(rand(1,3))
/mob/living/carbon/human/verb/check_pulse()
set category = "Object"
@@ -1251,3 +1256,106 @@ mob/living/carbon/human/yank_out_object()
else
usr << "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]."
/mob/living/carbon/human/proc/set_species(var/new_species)
if(!new_species)
new_species = "Human"
if(species && (species.name && species.name == new_species))
return
species = all_species[new_species]
see_in_dark = species.darksight
if(see_in_dark > 2)
see_invisible = SEE_INVISIBLE_LEVEL_ONE
else
see_invisible = SEE_INVISIBLE_LIVING
spawn(0)
update_icons()
if(species)
return 1
else
return 0
//Brain slug proc for voluntary removal of control.
/mob/living/carbon/human/proc/release_control()
set category = "Alien"
set name = "Release Control"
set desc = "Release control of your host's body."
var/datum/organ/external/head = get_organ("head")
var/mob/living/simple_animal/borer/B
for(var/I in head.implants)
if(istype(I,/mob/living/simple_animal/borer))
B = I
if(!B)
return
if(B.controlling)
src << "\red <B>You withdraw your probosci, releasing control of [B.host_brain]</B>"
B.host_brain << "\red <B>Your vision swims as the alien parasite releases control of your body.</B>"
B.ckey = ckey
B.controlling = 0
if(B.host_brain.ckey)
ckey = B.host_brain.ckey
B.host_brain.ckey = null
B.host_brain.name = "host brain"
B.host_brain.real_name = "host brain"
verbs -= /mob/living/carbon/human/proc/release_control
verbs -= /mob/living/carbon/human/proc/punish_host
verbs -= /mob/living/carbon/human/proc/spawn_larvae
//Brain slug proc for tormenting the host.
/mob/living/carbon/human/proc/punish_host()
set category = "Alien"
set name = "Torment host"
set desc = "Punish your host with agony."
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B)
return
if(B.host_brain.ckey)
src << "\red <B>You send a punishing spike of psychic agony lancing into your host's brain.</B>"
B.host_brain << "\red <B><FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT></B>"
//Check for brain worms in head.
/mob/living/carbon/human/proc/has_brain_worms()
var/datum/organ/external/head = get_organ("head")
for(var/I in head.implants)
if(istype(I,/mob/living/simple_animal/borer))
return I
return 0
/mob/living/carbon/human/proc/spawn_larvae()
set category = "Alien"
set name = "Reproduce"
set desc = "Spawn several young."
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B)
return
if(B.chemicals >= 100)
src << "\red <B>Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body.</B>"
visible_message("\red <B>[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</B>")
B.chemicals -= 100
new /obj/effect/decal/cleanable/vomit(get_turf(src))
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
new /mob/living/simple_animal/borer(get_turf(src))
else
src << "You do not have enough chemicals stored to reproduce."
return

View File

@@ -12,6 +12,8 @@
..()
M.delay_click(10)
if((M != src) && check_shields(0, M.name))
visible_message("\red <B>[M] attempted to touch [src]!</B>")
return 0
@@ -103,34 +105,19 @@
if("hurt")
var/attack_verb
if(M.dna)
switch(M.dna.mutantrace)
if("lizard")
attack_verb = "scratch"
if("tajaran")
attack_verb = "scratch"
if("plant")
attack_verb = "slash"
else
attack_verb = "punch"
M.attack_log += text("\[[time_stamp()]\] <font color='red'>[M.species.attack_verb]ed [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [M.species.attack_verb]ed by [M.name] ([M.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>[attack_verb]ed [src.name] ([src.ckey])</font>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [attack_verb]ed by [M.name] ([M.ckey])</font>")
log_attack("<font color='red'>[M.name] ([M.ckey]) [attack_verb]ed [src.name] ([src.ckey])</font>")
log_attack("<font color='red'>[M.name] ([M.ckey]) [M.species.attack_verb]ed [src.name] ([src.ckey])</font>")
var/damage = rand(0, 5)//BS12 EDIT
if(!damage)
switch(attack_verb)
if("slash")
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
if("scratch")
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
else
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
if(M.species.attack_verb == "punch")
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
else
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
visible_message("\red <B>[M] has attempted to [attack_verb] [src]!</B>")
visible_message("\red <B>[M] has attempted to [M.species.attack_verb] [src]!</B>")
return 0
@@ -140,21 +127,18 @@
if(HULK in M.mutations) damage += 5
switch(attack_verb)
if("slash")
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
if("scratch")
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
else
playsound(loc, "punch", 25, 1, -1)
if(M.species.attack_verb == "punch")
playsound(loc, "punch", 25, 1, -1)
else
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
visible_message("\red <B>[M] has [attack_verb]ed [src]!</B>")
visible_message("\red <B>[M] has [M.species.attack_verb]ed [src]!</B>")
//Rearranged, so claws don't increase weaken chance.
if(damage >= 5 && prob(50))
visible_message("\red <B>[M] has weakened [src]!</B>")
apply_effect(2, WEAKEN, armor_block)
if(attack_verb == "scratch") damage += 5
if(M.species.attack_verb != "punch") damage += 5
apply_damage(damage, BRUTE, affecting, armor_block)

View File

@@ -1,14 +1,14 @@
/mob/living/carbon/human/movement_delay()
var/tally = 0
if(reagents.has_reagent("hyperzine")) return -1
if(reagents.has_reagent("nuka_cola")) return -1
if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
if(reagents.has_reagent("hyperzine")) return -1
if(reagents.has_reagent("nuka_cola")) return -1
var/health_deficiency = (100 - health - halloss)
if(health_deficiency >= 40) tally += (health_deficiency / 25)
@@ -25,6 +25,8 @@
var/datum/organ/external/E = get_organ(organ_name)
if(!E || (E.status & ORGAN_DESTROYED))
tally += 4
if(E.status & ORGAN_SPLINTED)
tally += 0.5
else if(E.status & ORGAN_BROKEN)
tally += 1.5

View File

@@ -340,6 +340,16 @@
if("id")
if ((!( target.wear_id ) || !( target.w_uniform )))
del(src)
if("splints")
var/count = 0
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
var/datum/organ/external/o = target.organs_by_name[organ]
if(o.status & ORGAN_SPLINTED)
count = 1
break
if(count == 0)
del(src)
return
if("internal")
if ((!( (istype(target.wear_mask, /obj/item/clothing/mask) && istype(target.back, /obj/item/weapon/tank) && !( target.internal )) ) && !( target.internal )))
del(src)
@@ -443,6 +453,9 @@
message = "\red <B>[source] is trying to remove [target]'s internals</B>"
else
message = "\red <B>[source] is trying to set on [target]'s internals.</B>"
if("splints")
message = text("\red <B>[] is trying to remove []'s splints!</B>", source, target)
for(var/mob/M in viewers(target, null))
M.show_message(message, 1)
spawn( HUMAN_STRIP_DELAY )
@@ -541,6 +554,16 @@ It can still be worn/put on as normal.
slot_to_process = slot_legcuffed
if (target.legcuffed)
strip_item = target.legcuffed
if("splints")
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
var/datum/organ/external/o = target.get_organ(organ)
if (o && o.status & ORGAN_SPLINTED)
var/obj/item/W = new /obj/item/stack/medical/splint/single()
o.status &= ~ORGAN_SPLINTED
if (W)
W.loc = target.loc
W.layer = initial(W.layer)
W.add_fingerprint(source)
if("CPR")
if ((target.health > config.health_threshold_dead && target.health < config.health_threshold_crit))
var/suff = min(target.getOxyLoss(), 7)

View File

@@ -408,7 +408,7 @@
// Nitrogen, for Vox.
var/Nitrogen_pp = (breath.nitrogen/breath.total_moles())*breath_pressure
if(O2_pp < safe_oxygen_min && src.dna.mutantrace!="vox") // Too little oxygen
if(O2_pp < safe_oxygen_min && species.name != "Vox") // Too little oxygen
if(prob(20))
spawn(0) emote("gasp")
if(O2_pp > 0)
@@ -426,7 +426,7 @@
oxyloss += 5*ratio
oxygen_used = breath.oxygen*ratio/6
oxygen_alert = max(oxygen_alert, 1)*/
else if(Nitrogen_pp < safe_oxygen_min && src.dna.mutantrace=="vox") //Vox breathe nitrogen, not oxygen.
else if(Nitrogen_pp < safe_oxygen_min && species.name == "Vox") //Vox breathe nitrogen, not oxygen.
if(prob(20))
spawn(0) emote("gasp")
@@ -471,7 +471,7 @@
if(reagents)
reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
toxins_alert = max(toxins_alert, 1)
else if(O2_pp > vox_oxygen_max && src.dna.mutantrace=="vox") //Oxygen is toxic to vox.
else if(O2_pp > vox_oxygen_max && species.name == "Vox") //Oxygen is toxic to vox.
var/ratio = (breath.oxygen/vox_oxygen_max) * 1000
adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
toxins_alert = max(toxins_alert, 1)
@@ -492,30 +492,30 @@
if( (abs(310.15 - breath.temperature) > 50) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :(
if(status_flags & GODMODE) return 1 //godmode
if(breath.temperature < 260.15 && dna.mutantrace != "vox") //Vox are resistant to cold.
if(breath.temperature < species.cold_level_1)
if(prob(20))
src << "\red You feel your face freezing and an icicle forming in your lungs!"
else if(breath.temperature > 360.15)
else if(breath.temperature > species.heat_level_1)
if(prob(20))
src << "\red You feel your face burning and a searing heat in your lungs!"
switch(breath.temperature)
if(-INFINITY to 120)
if(-INFINITY to species.cold_level_3)
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
if(120 to 200 && dna.mutantrace != "vox") //Vox are resistant to cold.
if(species.cold_level_3 to species.cold_level_2)
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
if(200 to 260 && dna.mutantrace != "vox") //Vox are resistant to cold.
if(species.cold_level_2 to species.cold_level_1)
apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
if(360 to 400)
if(species.heat_level_1 to species.heat_level_2)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
if(400 to 1000)
if(species.heat_level_2 to species.heat_level_3)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
if(1000 to INFINITY)
if(species.heat_level_3 to INFINITY)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
@@ -596,22 +596,22 @@
var/pressure = environment.return_pressure()
var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
if(status_flags & GODMODE) return 1 //godmode
switch(adjusted_pressure)
if(HAZARD_HIGH_PRESSURE to INFINITY)
adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
pressure_alert = 2
if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE)
pressure_alert = 1
if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE)
pressure_alert = 0
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
pressure_alert = -1
if(adjusted_pressure >= species.hazard_high_pressure)
adjustBruteLoss( min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
pressure_alert = 2
else if(adjusted_pressure >= species.warning_high_pressure)
pressure_alert = 1
else if(adjusted_pressure >= species.warning_low_pressure)
pressure_alert = 0
else if(adjusted_pressure >= species.hazard_low_pressure)
pressure_alert = -1
else
if( !(COLD_RESISTANCE in mutations))
adjustBruteLoss( LOW_PRESSURE_DAMAGE )
pressure_alert = -2
else
if( !(COLD_RESISTANCE in mutations) && src.dna.mutantrace!="vox") //Vox are resistant to pressure loss.
adjustBruteLoss( LOW_PRESSURE_DAMAGE )
pressure_alert = -2
else
pressure_alert = -1
pressure_alert = -1
if(environment.toxins > MOLES_PLASMA_VISIBLE)
pl_effects()
@@ -841,8 +841,7 @@
if(status_flags & GODMODE) return 0 //godmode
adjustToxLoss(total_plasmaloss)
// if(dna && dna.mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist
if(PLANT in mutations)
if(species.flags & REQUIRE_LIGHT)
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
@@ -900,8 +899,7 @@
if(overeatduration > 1)
overeatduration -= 2 //doubled the unfat rate
// if(dna && dna.mutantrace == "plant")
if(PLANT in mutations)
if(species.flags & REQUIRE_LIGHT)
if(nutrition < 200)
take_overall_damage(2,0)
@@ -1148,14 +1146,12 @@
sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
if(dna)
switch(dna.mutantrace)
if("lizard","slime")
if("slime")
see_in_dark = 3
see_invisible = SEE_INVISIBLE_LEVEL_ONE
if("shadow","tajaran")
if("shadow")
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_ONE
else
see_in_dark = 2
if(XRAY in mutations)
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
@@ -1230,18 +1226,22 @@
see_invisible = SEE_INVISIBLE_LIVING
if(healths)
switch(hal_screwyhud)
if(1) healths.icon_state = "health6"
if(2) healths.icon_state = "health7"
else
switch(health - halloss)
if(100 to INFINITY) healths.icon_state = "health0"
if(80 to 100) healths.icon_state = "health1"
if(60 to 80) healths.icon_state = "health2"
if(40 to 60) healths.icon_state = "health3"
if(20 to 40) healths.icon_state = "health4"
if(0 to 20) healths.icon_state = "health5"
else healths.icon_state = "health6"
if (analgesic)
healths.icon_state = "health_health_numb"
else
switch(hal_screwyhud)
if(1) healths.icon_state = "health6"
if(2) healths.icon_state = "health7"
else
//switch(health - halloss)
switch(100 - traumatic_shock)
if(100 to INFINITY) healths.icon_state = "health0"
if(80 to 100) healths.icon_state = "health1"
if(60 to 80) healths.icon_state = "health2"
if(40 to 60) healths.icon_state = "health3"
if(20 to 40) healths.icon_state = "health4"
if(0 to 20) healths.icon_state = "health5"
else healths.icon_state = "health6"
if(nutrition_icon)
switch(nutrition)

View File

@@ -68,7 +68,7 @@
message = replacetext(message, "u", "<22>")
message = replacetext(message, "b", "<22>")
else if(istype(wear_mask, /obj/item/clothing/mask/luchador))
/*else if(istype(wear_mask, /obj/item/clothing/mask/luchador))
if(copytext(message, 1, 2) != "*")
message = replacetext(message, "captain", "CAPIT<49>N")
message = replacetext(message, "station", "ESTACI<43>N")
@@ -88,7 +88,7 @@
message = replacetext(message, "wizard", "mago")
message = uppertext(message) //Things end up looking better this way (no mixed cases), and it fits the macho wrestler image.
if(prob(25))
message += " OLE!"
message += " OLE!"*/
else if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
var/obj/item/clothing/mask/horsehead/hoers = wear_mask

View File

@@ -220,14 +220,12 @@ proc/get_damage_icon_part(damage_state, body_part)
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/necrosis_color_mod = rgb(10,50,0)
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"
@@ -240,8 +238,6 @@ proc/get_damage_icon_part(damage_state, body_part)
else if(hulk)
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)
var/datum/organ/external/head = get_organ("head")
var/has_head = 0
@@ -269,8 +265,6 @@ proc/get_damage_icon_part(damage_state, body_part)
else if(hulk)
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)
@@ -293,7 +287,7 @@ proc/get_damage_icon_part(damage_state, body_part)
stand_icon.Blend(temp, ICON_OVERLAY)
//Skin tone
if(!skeleton && !husk && !hulk && !plant)
if(!skeleton && !husk && !hulk && (species.flags & HAS_SKIN_TONE))
if(s_tone >= 0)
stand_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
else
@@ -309,18 +303,16 @@ proc/get_damage_icon_part(damage_state, body_part)
if(has_head)
//Eyes
if(!skeleton)
var/icon/eyes_s = new/icon('icons/mob/human_face.dmi', "eyes_s")
if(src.get_species()=="Vox")
eyes_s = new/icon('icons/mob/human_face.dmi', "vox_eyes_s")
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
stand_icon.Blend(eyes_s, ICON_OVERLAY)
var/icon/eyes = new/icon('icons/mob/human_face.dmi', species.eyes)
eyes.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
stand_icon.Blend(eyes, 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)
//Mouth (lipstick!)
if(lip_style && (species && species.flags & HAS_LIPS)) //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)
//Underwear
if(underwear >0 && underwear < 12 && (src.dna.mutantrace != "vox" && src.dna.mutantrace != "kidan"))
if(underwear >0 && underwear < 12 && species.flags & HAS_UNDERWEAR)
if(!fat && !skeleton)
stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
@@ -429,47 +421,23 @@ proc/get_damage_icon_part(damage_state, body_part)
var/skeleton = (SKELETON in src.mutations)
if(skeleton)
race_icon = 'icons/mob/human_races/r_skeleton.dmi'
else if(dna)
switch(dna.mutantrace)
if("tajaran")
race_icon = 'icons/mob/human_races/r_tajaran.dmi'
deform_icon = 'icons/mob/human_races/r_def_tajaran.dmi'
if("lizard")
race_icon = 'icons/mob/human_races/r_lizard.dmi'
deform_icon = 'icons/mob/human_races/r_def_lizard.dmi'
if("skrell")
race_icon = 'icons/mob/human_races/r_skrell.dmi'
deform_icon = 'icons/mob/human_races/r_def_skrell.dmi'
if("vox")
race_icon = 'icons/mob/human_races/r_vox.dmi'
deform_icon = 'icons/mob/human_races/r_def_vox.dmi'
else
race_icon = 'icons/mob/human_races/r_human.dmi'
deform_icon = 'icons/mob/human_races/r_def_human.dmi'
else
icon = 'icons/mob/human_races/r_human.dmi'
//Icon data is kept in species datums within the mob.
race_icon = species.icobase
deform_icon = species.deform
if(dna)
switch(dna.mutantrace)
if("golem","slime","shadow","adamantine")
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")
// if("lizard","tajaran","skrell")
// overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[gender]_l")
// overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[gender]_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
if(!dna || !(dna.mutantrace in list("golem","metroid")))
update_body(0)
update_hair(0)
if(update_icons) update_icons()
@@ -806,15 +774,11 @@ proc/get_damage_icon_part(damage_state, body_part)
/mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1)
overlays_lying[TAIL_LAYER] = null
overlays_standing[TAIL_LAYER] = null
var/cur_species = get_species()
if( cur_species == "Tajaran")
if(species.tail && species.flags & HAS_TAIL)
if(!wear_suit || !(wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space))
overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "tajtail_l")
overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "tajtail_s")
else if( cur_species == "Unathi")
if(!wear_suit || !(wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space))
overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "sogtail_l")
overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "sogtail_s")
overlays_lying[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_l")
overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
if(update_icons)
update_icons()

View File

@@ -10,116 +10,43 @@
update_icon = 0 ///no need to call regenerate_icon
var/obj/item/weapon/card/id/wear_id = null // Fix for station bounced radios -- Skie
var/greaterform = "Human" // Used when humanizing a monkey.
var/ico = "monkey" // Used when updating icons.
var/uni_append = "12C4E2" // Small appearance modifier for different species.
/mob/living/carbon/monkey/tajara
name = "farwa"
voice_name = "farwa"
voice_message = "mews"
say_message = "mews"
icon_state = "tajkey1"
ico = "tajkey"
uni_append = "0A0E00"
/mob/living/carbon/monkey/skrell
name = "neaera"
voice_name = "neaera"
voice_message = "squicks"
say_message = "squicks"
icon_state = "skrellkey1"
ico = "skrellkey"
uni_append = "01CC92"
/mob/living/carbon/monkey/unathi
name = "stok"
voice_name = "stok"
voice_message = "hisses"
say_message = "hisses"
icon_state = "stokkey1"
/mob/living/carbon/monkey/unathi/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
if(name == "stok")
name = text("stok ([rand(1, 1000)])")
real_name = name
if (!(dna))
if(gender == NEUTER)
gender = pick(MALE, FEMALE)
dna = new /datum/dna( null )
dna.real_name = real_name
dna.uni_identity = "000000000000000000DC0000066000"
dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
dna.unique_enzymes = md5(name)
dna.mutantrace = "lizard"
//////////blah
var/gendervar
if (gender == MALE)
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
else
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
dna.uni_identity += gendervar
dna.uni_identity += "044"
dna.uni_identity += "C5D"
..()
/mob/living/carbon/monkey/skrell/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
if(name == "neaera")
name = text("neaera ([rand(1, 1000)])")
real_name = name
if (!(dna))
if(gender == NEUTER)
gender = pick(MALE, FEMALE)
dna = new /datum/dna( null )
dna.real_name = real_name
dna.uni_identity = "000000000000000000DC0000066000"
dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
dna.unique_enzymes = md5(name)
dna.mutantrace = "skrell"
//////////blah
var/gendervar
if (gender == MALE)
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
else
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
dna.uni_identity += gendervar
dna.uni_identity += "01C"
dna.uni_identity += "C92"
..()
/mob/living/carbon/monkey/tajara/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
if(name == "farwa")
name = text("farwa ([rand(1, 1000)])")
real_name = name
if (!(dna))
if(gender == NEUTER)
gender = pick(MALE, FEMALE)
dna = new /datum/dna( null )
dna.real_name = real_name
dna.uni_identity = "000000000000000000DC0000066000"
dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
dna.unique_enzymes = md5(name)
dna.mutantrace = "tajaran"
//////////blah
var/gendervar
if (gender == MALE)
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
else
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
dna.uni_identity += gendervar
dna.uni_identity += "0A0"
dna.uni_identity += "E00"
..()
ico = "stokkey"
uni_append = "044C5D"
/mob/living/carbon/monkey/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
if(name == "monkey")
name = text("monkey ([rand(1, 1000)])")
real_name = name
if(name == "monkey" || name == "farwa" || name == "stok" || name == "neara") //Hideous but necessary to stop Pun-Pun becoming generic.
name = "[name] ([rand(1, 1000)])"
real_name = name
if (!(dna))
if(gender == NEUTER)
gender = pick(MALE, FEMALE)
@@ -134,12 +61,29 @@
gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
else
gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
dna.uni_identity += gendervar
dna.uni_identity += "12C"
dna.uni_identity += "4E2"
dna.uni_identity += "[gendervar][uni_append]"
..()
update_icons()
return
/mob/living/carbon/monkey/unathi/New()
..()
dna.mutantrace = "lizard"
greaterform = "Unathi"
/mob/living/carbon/monkey/skrell/New()
..()
dna.mutantrace = "skrell"
greaterform = "Skrell"
/mob/living/carbon/monkey/tajara/New()
..()
dna.mutantrace = "tajaran"
greaterform = "Tajaran"
/mob/living/carbon/monkey/movement_delay()
var/tally = 0
if(reagents)

View File

@@ -28,14 +28,7 @@
update_hud()
lying_prev = lying //so we don't update overlays for lying/standing unless our stance changes again
overlays.Cut()
var/ico = "monkey"
switch(src.dna.mutantrace) //On monkey spawn, check the DNA of the mob. If alien, change to appropriate alien monkey sprite
if("tajaran")
ico = "tajkey"
if("lizard")
ico = "stokkey"
if("skrell")
ico = "skrellkey"
if(lying)
icon_state = ico + "0"
for(var/image/I in overlays_lying)

View File

@@ -3,7 +3,14 @@
// proc to find out in how much pain the mob is at the moment
/mob/living/carbon/proc/updateshock()
src.traumatic_shock = src.getOxyLoss() + src.getToxLoss() + src.getFireLoss() + 1.2*src.getBruteLoss() + 2*src.getCloneLoss() + src.halloss
src.traumatic_shock = \
1 * src.getOxyLoss() + \
0.5 * src.getToxLoss() + \
2.5 * src.getFireLoss() + \
1.5 * src.getBruteLoss() + \
2 * src.getCloneLoss() + \
1 * src.halloss
if(reagents.has_reagent("alkysine"))
src.traumatic_shock -= 10
if(reagents.has_reagent("inaprovaline"))

View File

@@ -0,0 +1,96 @@
/*
Datum-based species. Should make for much cleaner and easier to maintain mutantrace code.
*/
/datum/species
var/name // Species name.
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set.
var/eyes = "eyes_s" // Icon for eyes.
var/primitive // Lesser form, if any (ie. monkey for humans)
var/tail // Name of tail image in species effects icon file.
var/language // Default racial language, if any.
var/attack_verb = "punch" // Empty hand hurt intent verb.
var/mutantrace // Safeguard due to old code.
var/breath_type // Non-oxygen gas breathed, if any.
var/cold_level_1 = 260 // Cold damage level 1 below this point.
var/cold_level_2 = 200 // Cold damage level 2 below this point.
var/cold_level_3 = 120 // Cold damage level 3 below this point.
var/heat_level_1 = 360 // Heat damage level 1 above this point.
var/heat_level_2 = 400 // Heat damage level 2 above this point.
var/heat_level_3 = 1000 // Heat damage level 2 above this point.
var/darksight = 2
var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure.
var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning.
var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning.
var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure.
var/brute_resist // Physical damage reduction.
var/burn_resist // Burn damage reduction.
var/flags = 0 // Various specific features.
/datum/species/human
name = "Human"
primitive = /mob/living/carbon/monkey
flags = HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR
/datum/species/unathi
name = "Unathi"
icobase = 'icons/mob/human_races/r_lizard.dmi'
deform = 'icons/mob/human_races/r_def_lizard.dmi'
language = "Sinta'unathi"
tail = "sogtail"
attack_verb = "scratch"
primitive = /mob/living/carbon/monkey/unathi
darksight = 3
flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL
/datum/species/tajaran
name = "Tajaran"
icobase = 'icons/mob/human_races/r_tajaran.dmi'
deform = 'icons/mob/human_races/r_def_tajaran.dmi'
language = "Siik'mas"
tail = "tajtail"
attack_verb = "scratch"
darksight = 8
primitive = /mob/living/carbon/monkey/tajara
flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL
/datum/species/skrell
name = "Skrell"
icobase = 'icons/mob/human_races/r_skrell.dmi'
deform = 'icons/mob/human_races/r_def_skrell.dmi'
language = "Skrellian"
primitive = /mob/living/carbon/monkey/skrell
flags = WHITELISTED | HAS_LIPS | HAS_UNDERWEAR
/datum/species/vox
name = "Vox"
icobase = 'icons/mob/human_races/r_vox.dmi'
deform = 'icons/mob/human_races/r_def_vox.dmi'
language = "Vox-pidgin"
eyes = "vox_eyes_s"
breath_type = "nitrogen"
flags = NO_SCAN
/datum/species/diona
name = "Diona"
icobase = 'icons/mob/human_races/r_plant.dmi'
deform = 'icons/mob/human_races/r_def_plant.dmi'
attack_verb = "slash"
flags = NO_EAT | NO_BREATHE | REQUIRE_LIGHT | NON_GENDERED | NO_SCAN | IS_PLANT

View File

@@ -85,6 +85,8 @@ var/list/department_radio_keys = list(
if(dongle.translate_hive) return 1
/mob/living/say(var/message)
//world << "[src] speaks! [message]"
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
message = capitalize(message)
@@ -123,11 +125,14 @@ var/list/department_radio_keys = list(
var/italics = 0
var/message_range = null
var/message_mode = null
var/datum/language/speaking //For use if a specific language is being spoken.
// If brain damaged, talk on headset at random.
if (getBrainLoss() >= 60 && prob(50))
if (ishuman(src))
message_mode = "headset"
// Special message handling
// General public key. Special message handling
else if (copytext(message, 1, 2) == ";")
if (ishuman(src))
message_mode = "headset"
@@ -138,6 +143,12 @@ var/list/department_radio_keys = list(
else if (length(message) >= 2)
var/channel_prefix = copytext(message, 1, 3)
//Check if the person is speaking a language that they know.
for(var/datum/language/L in languages)
if(lowertext(channel_prefix) == ":[L.key]")
//world << "Key [L.key] matches [lowertext(channel_prefix)] for [src]."
speaking = L
break
message_mode = department_radio_keys[channel_prefix]
//world << "channel_prefix=[channel_prefix]; message_mode=[message_mode]"
if (message_mode)
@@ -183,11 +194,6 @@ var/list/department_radio_keys = list(
message += "Z"
*/
var/list/obj/item/used_radios = new
var/is_speaking_skrell = 0
var/is_speaking_soghun = 0
var/is_speaking_taj = 0
var/is_speaking_vox = 0
var/is_speaking_radio = 0
switch (message_mode)
@@ -274,22 +280,6 @@ var/list/department_radio_keys = list(
message_range = 1
italics = 1
if ("tajaran")
if(tajaran_talk_understand || universal_speak)
is_speaking_taj = 1
if ("soghun")
if(soghun_talk_understand || universal_speak)
is_speaking_soghun = 1
if ("skrell")
if(skrell_talk_understand || universal_speak)
is_speaking_skrell = 1
if ("vox")
if(vox_talk_understand || universal_speak)
is_speaking_vox = 1
if("changeling")
if(mind && mind.changeling)
for(var/mob/Changeling in mob_list)
@@ -377,20 +367,37 @@ var/list/department_radio_keys = list(
for (var/M in listening)
if(hascall(M,"say_understands"))
if (M:say_understands(src) && !is_speaking_skrell && !is_speaking_soghun && !is_speaking_vox && !is_speaking_taj)
if ((M:say_understands(src) && !speaking))
//world << "[M] understood [src] (0)."
heard_a += M
else if(ismob(M))
if(is_speaking_skrell && (M:skrell_talk_understand || M:universal_speak))
heard_a += M
else if(is_speaking_soghun && (M:soghun_talk_understand || M:universal_speak))
heard_a += M
else if(is_speaking_taj && (M:tajaran_talk_understand || M:universal_speak))
heard_a += M
else if(is_speaking_vox && (M:vox_talk_understand || M:universal_speak))
heard_a += M
// If speaking is set, it means that a language has been found that uses the given key.
// If it hasn't, then they are likely just speaking English.
var/understood
var/mob/P = M
if (speaking)
for(var/datum/language/L in P.languages)
if(speaking.name == L.name)
understood = 1
if(understood || P.universal_speak)
//world << "[M] understood [src] (1)."
heard_a += M
else if(istype(P,/mob/living/carbon/human))
var/mob/living/carbon/human/H = P
if(H.has_brain_worms()) // Brain worms act like Babelfish.
heard_a += M
else
heard_b += M
else
//world << "[M] didn't understand [src]."
heard_b += M
else
heard_b += M
heard_a += M
else
//world << "[M] understood [src] (2)."
heard_a += M
var/speech_bubble_test = say_test(message)
@@ -403,7 +410,7 @@ var/list/department_radio_keys = list(
var/rendered = null
if (length(heard_a))
var/message_a = say_quote(message,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox)
var/message_a = say_quote(message,speaking)
if (italics)
message_a = "<i>[message_a]</i>"
@@ -428,7 +435,7 @@ var/list/department_radio_keys = list(
message_b = voice_message
else
message_b = stars(message)
message_b = say_quote(message_b,is_speaking_soghun,is_speaking_skrell,is_speaking_taj,is_speaking_vox)
message_b = say_quote(message_b,speaking)
if (italics)
message_b = "<i>[message_b]</i>"

View File

@@ -340,7 +340,7 @@ var/list/ai_list = list()
if(href_list["say_word"])
src.announcement(href_list["say_word"])
return
if (href_list["lawi"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite
var/L = text2num(href_list["lawi"])
switch(ioncheck[L])
@@ -561,10 +561,9 @@ var/list/ai_list = list()
if(!C.can_use())
continue
var/list/tempnetwork = C.network
tempnetwork.Remove("CREED", "thunder", "RD", "toxins", "Prison")
var/list/tempnetwork = difflist(C.network,RESTRICTED_CAMERA_NETWORKS,1)
if(tempnetwork.len)
for(var/i in C.network)
for(var/i in tempnetwork)
cameralist[i] = i
var/old_network = network
network = input(U, "Which network would you like to view?") as null|anything in cameralist

View File

@@ -67,7 +67,7 @@
var/oldLoc = src.loc
. = ..()
if(.)
if(src.camera)
if(src.camera && src.camera.network.len)
if(!updating)
updating = 1
spawn(BORG_CAMERA_BUFFER)
@@ -89,12 +89,16 @@
/obj/machinery/camera/New()
..()
cameranet.cameras += src
cameranet.addCamera(src)
cameranet.cameras += src //Camera must be added to global list of all cameras no matter what...
var/list/open_networks = difflist(network,RESTRICTED_CAMERA_NETWORKS) //...but if all of camera's networks are restricted, it only works for specific camera consoles.
if(open_networks.len) //If there is at least one open network, chunk is available for AI usage.
cameranet.addCamera(src)
/obj/machinery/camera/Del()
cameranet.cameras -= src
cameranet.removeCamera(src)
var/list/open_networks = difflist(network,RESTRICTED_CAMERA_NETWORKS)
if(open_networks.len)
cameranet.removeCamera(src)
..()
#undef BORG_CAMERA_BUFFER

View File

@@ -38,8 +38,9 @@ var/const/VOX_VOLUME = 75
set desc = "Display a list of vocal words to announce to the crew."
set category = "AI Commands"
var/dat = "Here is a list of words you can type into the Announcement button to create sentences to vocally announce.<BR> \
src << "\red VOX is disabled until issues with the code can be sorted."
return
/* var/dat = "Here is a list of words you can type into the Announcement button to create sentences to vocally announce.<BR> \
Do not use punctuation as you would normally, if you want a pause you can use the full stop and comma characters by separating them with spaces, like so: 'Alpha . Test , Bravo'.<BR>"
var/index = 0
@@ -49,7 +50,7 @@ var/const/VOX_VOLUME = 75
if(index != vox_sounds.len)
dat += " / "
src << browse(dat, "window=announce_help;size=500x400")
src << browse(dat, "window=announce_help;size=500x400")*/
/mob/living/silicon/ai/verb/announcement(var/message as text)
@@ -58,6 +59,9 @@ var/const/VOX_VOLUME = 75
set desc = "Create a vocal announcement by typing in the available words to create a setence. More help is available in 'Announcement Help'"
set category = "AI Commands"
src << "\red VOX is disabled until issues with the code can be sorted."
return
/*
if(!message)
return
//if(!announcing_vox > world.time)
@@ -81,9 +85,9 @@ var/const/VOX_VOLUME = 75
if(incorrect_words.len)
src << "<span class='notice'>These words are not available on the announcement system: [english_list(incorrect_words)].</span>"
*/
/proc/play_vox_word(var/word, var/z_level)
/*
word = lowertext(word)
if(vox_sounds[word])
@@ -99,12 +103,12 @@ var/const/VOX_VOLUME = 75
if(T.z == z_level)
M << voice
return 1
return 0
return 0*/
// List is required to compile the resources into the game when it loads.
// Dynamically loading it has bad results with sounds overtaking each other, even with the wait variable.
var/list/vox_sounds = list("," = 'sound/vox/,.wav',
var/list/vox_sounds = list(/*"," = 'sound/vox/,.wav',
"." = 'sound/vox/..wav',
"a" = 'sound/vox/a.wav',
"accelerating" = 'sound/vox/accelerating.wav',
@@ -719,4 +723,4 @@ var/list/vox_sounds = list("," = 'sound/vox/,.wav',
"yourself" = 'sound/vox/yourself.wav',
"zero" = 'sound/vox/zero.wav',
"zone" = 'sound/vox/zone.wav',
"zulu" = 'sound/vox/zulu.wav')
"zulu" = 'sound/vox/zulu.wav'*/)

View File

@@ -102,7 +102,7 @@
if(!scrambledcodes && !camera)
camera = new /obj/machinery/camera(src)
camera.c_tag = real_name
camera.network = list("SS13")
camera.network = list("SS13","Robots")
if(isWireCut(5)) // 5 = BORG CAMERA
camera.status = 0
@@ -177,6 +177,8 @@
if("Miner")
module = new /obj/item/weapon/robot_module/miner(src)
channels = list("Supply" = 1)
if(camera && "Robots" in camera.network)
camera.network.Add("MINE")
module_sprites["Basic"] = "Miner_old"
module_sprites["Advanced Droid"] = "droid-miner"
module_sprites["Treadhead"] = "Miner"
@@ -184,6 +186,8 @@
if("Medical")
module = new /obj/item/weapon/robot_module/medical(src)
channels = list("Medical" = 1)
if(camera && "Robots" in camera.network)
camera.network.Add("Medical")
module_sprites["Basic"] = "Medbot"
module_sprites["Advanced Droid"] = "droid-medical"
module_sprites["Needles"] = "medicalrobot"
@@ -196,7 +200,6 @@
module_sprites["Red Knight"] = "Security"
module_sprites["Black Knight"] = "securityrobot"
module_sprites["Bloodhound"] = "bloodhound"
module_sprites["Mark II"] = "droid-combat"
if("Engineering")
module = new /obj/item/weapon/robot_module/engineering(src)
@@ -1176,12 +1179,8 @@
scrambledcodes = 1
//Disconnect it's camera so it's not so easily tracked.
if(src.camera)
del(src.camera)
src.camera = null
// I'm trying to get the Cyborg to not be listed in the camera list
// Instead of being listed as "deactivated". The downside is that I'm going
// to have to check if every camera is null or not before doing anything, to prevent runtime errors.
// I could change the network to null but I don't know what would happen, and it seems too hacky for me.
src.camera.network = list()
cameranet.removeCamera(src.camera)
/mob/living/silicon/robot/proc/ResetSecurityCodes()

View File

@@ -145,8 +145,8 @@
if (bot.connected_ai == ai)
return 1
return 0
// this function shows the health of the pAI in the Status panel
/mob/living/silicon/proc/show_system_integrity()
if(!src.stat)
@@ -154,25 +154,25 @@
else
stat(null, text("Systems nonfunctional"))
// This is a pure virtual function, it should be overwritten by all subclasses
/mob/living/silicon/proc/show_malf_ai()
return 0
// this function displays the station time in the status panel
/mob/living/silicon/proc/show_station_time()
stat(null, "Station Time: [worldtime2text()]")
// this function displays the shuttles ETA in the status panel if the shuttle has been called
/mob/living/silicon/proc/show_emergency_shuttle_eta()
if(emergency_shuttle.online && emergency_shuttle.location < 2)
var/timeleft = emergency_shuttle.timeleft()
if (timeleft)
stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
// This adds the basic clock, shuttle recall timer, and malf_ai info to all silicon lifeforms
/mob/living/silicon/Stat()
..()
@@ -182,13 +182,13 @@
show_emergency_shuttle_eta()
show_system_integrity()
show_malf_ai()
// this function displays the stations manifest in a separate window
/mob/living/silicon/proc/show_station_manifest()
var/dat
dat += "<h4>Crew Manifest</h4>"
if(data_core)
dat += data_core.get_manifest(0) // make it monochrome
dat += data_core.get_manifest(1) // make it monochrome
dat += "<br>"
src << browse(dat, "window=airoster")
onclose(src, "airoster")

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