Recommits storage

This commit is contained in:
AlexanderSeto
2014-06-12 16:28:19 -07:00
276 changed files with 2355606 additions and 25621 deletions
@@ -48,7 +48,7 @@ obj/machinery/atmospherics/binary/volume_pump
// ..()
if(stat & (NOPOWER|BROKEN))
return
if(!on)
if(!on || transfer_rate < 1)
return 0
// Pump mechanism just won't do anything if the pressure is too high/too low
@@ -3,9 +3,9 @@
*/
/obj/item/clothing/suit/space/powered
name = "Powered armor"
name = "Powered armor suit"
desc = "Not for rookies."
icon_state = "swat"
icon_state = "power_armour"
item_state = "swat"
w_class = 4//bulky item
@@ -14,7 +14,7 @@
body_parts_covered = UPPER_TORSO|LEGS|FEET|ARMS
armor = list(melee = 40, bullet = 30, laser = 20,energy = 15, bomb = 25, bio = 10, rad = 10)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/gun,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
slowdown = 9
slowdown = 5
var/fuel = 0
var/list/togglearmor = list(melee = 90, bullet = 70, laser = 60,energy = 40, bomb = 75, bio = 75, rad = 75)
@@ -23,10 +23,10 @@
var/helmrequired = 1
var/obj/item/clothing/head/space/powered/helm
var/glovesrequired = 0
var/glovesrequired = 1
var/obj/item/clothing/gloves/powered/gloves
var/shoesrequired = 0
var/shoesrequired = 1
var/obj/item/clothing/shoes/powered/shoes
//Adding gloves and shoes as possible armor components. --NEO
@@ -197,16 +197,44 @@
user << "<span class='danger'>The generator already has plenty of plasma.</span>"
return
..()
if(!servos)
if(istype(W,/obj/item/powerarmor/servos))
servos = W
W.loc = src
servos.parent = src
user << "<span class='notice'>You add some servos to the armor.</span>"
if(!reactive)
if(istype(W,/obj/item/powerarmor/reactive))
reactive = W
W.loc = src
reactive.parent = src
user << "<span class='notice'>You add some reactive plating to the armor.</span>"
if(!atmoseal)
if(istype(W,/obj/item/powerarmor/atmoseal))
atmoseal = W
W.loc = src
atmoseal.parent = src
user << "<span class='notice'>You add an atmospheric seals to the armor.</span>"
if(!power)
if(istype(W,/obj/item/powerarmor/power))
power = W
W.loc = src
power.parent = src
user << "<span class='notice'>You add a power module to the armor.</span>"
else
user << "<span class='danger'>The armor already contains a module of that type..</span>"
return
..()
/obj/item/clothing/head/space/powered
name = "Powered armor"
icon_state = "swat"
name = "Powered armor helmet"
desc = "Not for rookies."
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | BLOCKHAIR
icon_state = "power_armour_helmet"
item_state = "swat"
armor = list(melee = 40, bullet = 30, laser = 20,energy = 15, bomb = 25, bio = 10, rad = 10)
var/obj/item/clothing/suit/space/powered/parent
slowdown = 1
/obj/item/clothing/head/space/powered/proc/atmotoggle()
set category = "Object"
@@ -236,45 +264,31 @@
/obj/item/clothing/gloves/powered
name = "Powered armor"
icon_state = "swat"
name = "Powered armor gloves"
desc = "Not for rookies."
flags = FPRINT | TABLEPASS
item_state = "swat"
icon_state = "power_armour_gloves"
item_state = "power_armour_gloves"
armor = list(melee = 40, bullet = 30, laser = 20,energy = 15, bomb = 25, bio = 10, rad = 10)
slowdown = 1
/obj/item/clothing/shoes/powered
name = "Powered armor"
icon_state = "swat"
name = "Powered armor boots"
desc = "Not for rookies."
flags = FPRINT | TABLEPASS
icon_state = "power_armour_boots"
item_state = "swat"
armor = list(melee = 40, bullet = 30, laser = 20,energy = 15, bomb = 25, bio = 10, rad = 10)
obj/item/clothing/suit/space/powered/spawnable/badmin/New()
servos = new /obj/item/powerarmor/servos(src)
servos.parent = src
reactive = new /obj/item/powerarmor/reactive(src)
reactive.parent = src
atmoseal = new /obj/item/powerarmor/atmoseal/optional/adminbus(src)
atmoseal.parent = src
power = new /obj/item/powerarmor/power(src)
power.parent = src
verbs += /obj/item/clothing/suit/space/powered/proc/poweron
var/obj/item/clothing/head/space/powered/helm = new /obj/item/clothing/head/space/powered(src.loc)
helm.verbs += /obj/item/clothing/head/space/powered/proc/atmotoggle
slowdown = 2
obj/item/clothing/suit/space/powered/spawnable/regular/New()
servos = new /obj/item/powerarmor/servos(src)
servos.parent = src
reactive = new /obj/item/powerarmor/reactive/Centcom(src)
reactive = new /obj/item/powerarmor/reactive(src)
reactive.parent = src
atmoseal = new /obj/item/powerarmor/atmoseal/optional/adminbus(src)
atmoseal = new /obj/item/powerarmor/atmoseal(src)
atmoseal.parent = src
power = new /obj/item/powerarmor/power(src)
power = new /obj/item/powerarmor/power/powercell(src)
power.parent = src
verbs += /obj/item/clothing/suit/space/powered/proc/poweron
@@ -5,6 +5,7 @@
/obj/item/powerarmor
name = "Generic power armor component"
desc = "This is the base object, you should never see one."
icon = 'icons/obj/stock_parts.dmi'
var/obj/item/clothing/suit/space/powered/parent //so the component knows which armor it belongs to.
slowdown = 0 //how much the component slows down the wearer
@@ -26,6 +27,7 @@
/obj/item/powerarmor/power/plasma
name = "Miniaturized plasma generator"
desc = "Runs on plasma."
icon_state = "plasma"
slowdown = 1
var/fuel = 0
@@ -45,12 +47,13 @@
/obj/item/powerarmor/power/powercell
name = "Powercell interface"
desc = "Boring, but reliable."
icon_state = "powercell_interface"
var/obj/item/weapon/cell/cell
slowdown = 0.5
/obj/item/powerarmor/power/powercell/process()
if (cell && cell.charge > 0 && parent.active)
cell.use(50)
cell.use(500)
spawn(50)
process()
return
@@ -64,6 +67,7 @@
/obj/item/powerarmor/power/nuclear
name = "Miniaturized nuclear generator"
desc = "For all your radioactive needs."
icon_state = "nuclear"
slowdown = 1.5
/obj/item/powerarmor/power/nuclear/process()
@@ -91,10 +95,10 @@
return !crit_fail
/obj/item/powerarmor/reactive
name = "Adminbus power armor reactive plating"
desc = "Made with the rare Badminium molecule."
var/list/togglearmor = list(melee = 250, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100)
//Good lord an active energy axe does 150 damage a swing? Anyway, barring var editing, this armor loadout should be impervious to anything. Enjoy, badmins~ --NEO
name = "Centcom power armor reactive plating"
desc = "Pretty effective against everything, not perfect though."
var/list/togglearmor = list(melee = 90, bullet = 70, laser = 60,energy = 40, bomb = 75, bio = 75, rad = 75)
slowdown = 2
/obj/item/powerarmor/reactive/toggle(sudden = 0)
switch(parent.active)
@@ -116,16 +120,13 @@
if(parent.shoes)
parent.shoes.armor[armorvar] = parent.armor[armorvar]
/obj/item/powerarmor/reactive/Centcom
name = "Centcom power armor reactive plating"
desc = "Pretty effective against everything, not perfect though."
togglearmor = list(melee = 90, bullet = 70, laser = 60,energy = 40, bomb = 75, bio = 75, rad = 75)
slowdown = 2
/obj/item/powerarmor/servos
name = "Adminbus power armor movement servos"
desc = "Made with the rare Badminium molecule."
name = "Power armor movement servos"
desc = "Help with moving in the the bulky armor."
icon_state = "servos"
var/toggleslowdown = 9
/obj/item/powerarmor/servos/toggle(sudden = 0)
@@ -141,6 +142,7 @@
/obj/item/powerarmor/atmoseal
name = "Power armor atmospheric seals"
desc = "Keeps the bad stuff out."
icon_state = "atmosseal"
slowdown = 1
var/sealed = 0
@@ -201,11 +203,6 @@
parent.shoes.max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECITON_TEMPERATURE
sealed = 1
/obj/item/powerarmor/atmoseal/adminbus
name = "Adminbus power armor atmospheric seals"
desc = "Made with the rare Badminium molecule."
slowdown = 0
/obj/item/powerarmor/atmoseal/optional
name = "Togglable power armor atmospheric seals"
desc = "Keeps the bad stuff out, but lets you remove your helmet without having to turn the whole suit off."
@@ -260,10 +257,5 @@
/obj/item/powerarmor/atmoseal/optional/adminbus
name = "Adminbus togglable power armor atmospheric seals"
desc = "Made with the rare Badminium molecule."
slowdown = 0
+2
View File
@@ -133,7 +133,9 @@ var/list/alldepartments = list("Central Command")
authenticated = 0
if(href_list["dept"])
var/lastdpt = dpt
dpt = input(usr, "Which department?", "Choose a department", "") as null|anything in alldepartments
if(!dpt) dpt = lastdpt
if(href_list["auth"])
if ( (!( authenticated ) && (scan)) )
+3 -5
View File
@@ -224,11 +224,9 @@ mob/living/carbon/human/airflow_hit(atom/A)
// for(var/mob/M in hearers(src))
// M.show_message("\red <B>[src] slams into [A]!</B>",1,"\red You hear a loud slam!",2)
playsound(src.loc, "punch", 25, 1, -1)
loc:add_blood(src)
if (src.wear_suit)
src.wear_suit.add_blood(src)
if (src.w_uniform)
src.w_uniform.add_blood(src)
if (prob(33))
loc:add_blood(src)
bloody_body(src)
var/b_loss = airflow_speed * vsc.airflow_damage
var/blocked = run_armor_check("head","melee")
+7 -6
View File
@@ -9,11 +9,11 @@
src:Topic(href, href_list)
return null
/proc/get_area_master(O)
/proc/get_area_master(const/O)
var/area/A = get_area(O)
if(A && A.master)
A = A.master
return A
if (isarea(A))
return A.master
/proc/get_area(O)
var/atom/location = O
@@ -232,8 +232,9 @@
if(M)
var/turf/ear = get_turf(M)
if(ear)
if(speaker_coverage[ear])
. |= M
// Ghostship is magic: Ghosts can hear radio chatter from anywhere
if(speaker_coverage[ear] || (istype(M, /mob/dead/observer) && (M.client) && (M.client.prefs.toggles & CHAT_GHOSTRADIO)))
. |= M // Since we're already looping through mobs, why bother using |= ? This only slows things down.
return .
#define SIGN(X) ((X<0)?-1:1)
+7 -1
View File
@@ -21,10 +21,11 @@ var/global/list/surgery_steps = list() //list of all surgery steps |BS12
var/global/list/side_effects = list() //list of all medical sideeffects types by thier names |BS12
var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking.
var/global/list/joblist = list() //list of all jobstypes, minus borg and AI
var/global/list/flag_list = list() //list of flags during Nations gamemode
//Languages/species/whitelist.
var/global/list/all_species[0]
var/global/list/all_languages[0]
var/global/list/all_nations[0]
var/global/list/whitelisted_species = list()
// Posters
@@ -97,6 +98,11 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
var/datum/job/J = new T
joblist[J.title] = J
paths = typesof(/datum/nations)-/datum/nations
for(var/T in paths)
var/datum/nations/N = new T
all_nations[N.name] = N
//Languages and species.
paths = typesof(/datum/language)-/datum/language
for(var/T in paths)
+25
View File
@@ -290,6 +290,31 @@ proc/listclearnulls(list/list)
return (result + R.Copy(Ri, 0))
// List of lists, sorts by element[key] - for things like crew monitoring computer sorting records by name.
/proc/sortByKey(var/list/L, var/key)
if(L.len < 2)
return L
var/middle = L.len / 2 + 1
return mergeKeyedLists(sortByKey(L.Copy(0, middle), key), sortByKey(L.Copy(middle), key), key)
/proc/mergeKeyedLists(var/list/L, var/list/R, var/key)
var/Li=1
var/Ri=1
var/list/result = new()
while(Li <= L.len && Ri <= R.len)
if(sorttext(L[Li][key], R[Ri][key]) < 1)
// Works around list += list2 merging lists; it's not pretty but it works
result += "temp item"
result[result.len] = R[Ri++]
else
result += "temp item"
result[result.len] = L[Li++]
if(Li <= L.len)
return (result + L.Copy(Li, 0))
return (result + R.Copy(Ri, 0))
//Mergesort: any value in a list, preserves key=value structure
/proc/sortAssoc(var/list/L)
if(L.len < 2)
+4 -2
View File
@@ -109,12 +109,14 @@ Proc for attack log creation, because really why not
*/
proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=null)
var/list/ignore=list("shaked","CPRed","grabbed","punched")
if(ismob(user))
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Has [what_done] [target.name][ismob(target) ? "([target.ckey])" : ""][object ? " with [object]" : " "][addition]</font>")
if(ismob(target))
target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [what_done] by [user.name][ismob(user) ? "([user.ckey])" : ""][object ? " with [object]" : " "][addition]</font>")
log_attack("<font color='red'>[user.name][ismob(user) ? "([user.ckey])" : ""] [what_done] [target.name][ismob(target) ? "([target.ckey])" : ""][object ? " with [object]" : " "][addition]</font>")
if(target.client)
if(what_done != ("shaked" || "CPRed" || "grabbed"))
message_admins("[user.name][ismob(user) ? "([user.ckey])" : ""] [what_done] [target.name][ismob(target) ? "([target.ckey])" : ""][object ? " with [object]" : " "][addition](<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[target.x];Y=[target.y];Z=[target.z]'>JMP</a>)")
if(what_done in ignore) return
if(target == user)return
message_admins("[user.name][ismob(user) ? "([user.ckey])" : ""] [what_done] [target.name][ismob(target) ? "([target.ckey])" : ""][object ? " with [object]" : " "][addition](<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[target.x];Y=[target.y];Z=[target.z]'>JMP</a>)")
+3 -1
View File
@@ -43,6 +43,8 @@ var/religion_name = null
return capitalize(name)
/proc/system_name()
return "Tau Ceti"
/proc/station_name()
if (station_name)
@@ -321,4 +323,4 @@ var/syndicate_code_response//Code response for traitors.
if(5)
return
*/
*/
+26 -2
View File
@@ -163,14 +163,38 @@
//slower then list2text, but correctly processes associative lists.
proc/tg_list2text(list/list, glue=",")
proc/tg_list2text(list/list, glue=",", assocglue=";")
if(!istype(list) || !list.len)
return
var/output
for(var/i=1 to list.len)
output += (i!=1? glue : null)+(!isnull(list["[list[i]]"])?"[list["[list[i]]"]]":"[list[i]]")
if(!isnull(list["[list[i]]"]))
output += (i!=1? glue : null)+ "[list[i]]"+(i!=1? assocglue : null)+"[list["[list[i]]"]]"
else
output += (i!=1? glue : null)+ "[list[i]]"
return output
proc/tg_text2list(text, glue=",", assocglue=";")
var/length = length(glue)
if(length < 1) return list(text)
. = list()
var/lastglue_found = 1
var/foundglue
var/foundassocglue
var/searchtext
do
foundglue = findtext(text, glue, lastglue_found, 0)
searchtext = copytext(text, lastglue_found, foundglue)
foundassocglue = findtext(searchtext, assocglue, 1, 0)
if(foundassocglue)
var/sublist = copytext(searchtext, 1, foundassocglue)
sublist[1] = copytext(searchtext, foundassocglue, 0)
. += sublist
else
. += copytext(text, lastglue_found, foundglue)
lastglue_found = foundglue + length
while(foundglue)
//Converts a string into a list by splitting the string at each delimiter found. (discarding the seperator)
/proc/text2list(text, delimiter="\n")
+16 -7
View File
@@ -1234,12 +1234,21 @@ proc/get_mob_with_client_list()
else return zone
/proc/get_turf(turf/location)
while(location)
if(isturf(location))
return location
location = location.loc
return null
/proc/get_turf(const/atom/O)
if (isnull(O) || isarea(O))
return
var/atom/A = O
for (var/i = 0, ++i <= 20)
if (isturf(A))
return A
switch (istype(A))
if (1)
A = A.loc
if (0)
return
/proc/get(atom/loc, type)
while(loc)
@@ -1621,4 +1630,4 @@ atom/proc/GetTypeInAllContents(typepath)
processed |= A
return found
return found
+3 -5
View File
@@ -19,6 +19,7 @@
var/log_pda = 0 // log pda messages
var/log_runtimes = 0 // Logs all runtimes.
var/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits
var/log_runtime = 0 // logs world.log to a file
var/sql_enabled = 1 // for sql switching
var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour
var/allow_vote_restart = 0 // allow votes to restart
@@ -248,14 +249,11 @@
if ("log_pda")
config.log_pda = 1
if ("log_runtimes")
config.log_runtimes = 1
if ("log_hrefs")
config.log_hrefs = 1
if ("mentors")
config.mods_are_mentors = 1
if ("log_runtime")
config.log_runtime = 1
if ("mentors")
config.mods_are_mentors = 1
+7
View File
@@ -16,6 +16,13 @@
*/
/hook/roundend
/**
* LateSpawn hook.
* Called in newplayer.dm when a humanoid character joins the round after it started.
* Parameters: var/mob/living/carbon/human
*/
/hook/latespawn
/**
* Death hook.
* Called in death.dm when someone dies.
+1 -1
View File
@@ -59,7 +59,7 @@ datum/shuttle_controller/proc/recall()
if(direction == 1)
var/timeleft = timeleft()
if(alert == 0)
if(timeleft >= 600)
if(timeleft >= get_shuttle_arrive_time())
return
captain_announce("The emergency shuttle has been recalled.")
world << sound('sound/AI/shuttlerecalled.ogg')
@@ -17,104 +17,16 @@ var/global/datum/crafting_controller/crafting_master
..()
crafting_master.add_recipe_to_family("table", src)
//////////////////////////////////////
// //
// ~* E X A M P L E S *~ //
// //
//////////////////////////////////////
/datum/crafting_recipe/table/IED
name = "IED"
result_path = /obj/item/weapon/grenade/iedcasing
reqs = list(/obj/item/weapon/handcuffs/cable = 1,
/obj/item/stack/cable_coil = 1,
/obj/item/device/assembly/igniter = 1,
/obj/item/weapon/reagent_containers/food/drinks/cans = 1,
/datum/reagent/fuel = 10)
time = 80
/datum/crafting_recipe/table/stunprod
name = "Stunprod"
result_path = /obj/item/weapon/melee/baton/cattleprod
reqs = list(/obj/item/weapon/handcuffs/cable = 1,
/obj/item/stack/rods = 1,
/obj/item/weapon/wirecutters = 1,
/obj/item/weapon/cell = 1)
time = 80
parts = list(/obj/item/weapon/cell = 1)
/datum/crafting_recipe/table/ed209
name = "ED209"
result_path = /obj/machinery/bot/ed209
reqs = list(/obj/item/robot_parts/robot_suit = 1,
/obj/item/clothing/head/helmet = 1,
/obj/item/clothing/suit/armor/vest = 1,
/obj/item/robot_parts/l_leg = 1,
/obj/item/robot_parts/r_leg = 1,
/obj/item/stack/sheet/metal = 5,
/obj/item/stack/cable_coil = 5,
/obj/item/weapon/gun/energy/taser = 1,
/obj/item/weapon/cell = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
tools = list(/obj/item/weapon/weldingtool, /obj/item/weapon/screwdriver)
time = 120
/datum/crafting_recipe/table/secbot
name = "Secbot"
result_path = /obj/machinery/bot/secbot
reqs = list(/obj/item/device/assembly/signaler = 1,
/obj/item/clothing/head/helmet = 1,
/obj/item/weapon/melee/baton = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
tools = list(/obj/item/weapon/weldingtool)
time = 120
/datum/crafting_recipe/table/cleanbot
name = "Cleanbot"
result_path = /obj/machinery/bot/cleanbot
reqs = list(/obj/item/weapon/reagent_containers/glass/bucket = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
time = 80
/datum/crafting_recipe/table/floorbot
name = "Floorbot"
result_path = /obj/machinery/bot/floorbot
reqs = list(/obj/item/weapon/storage/toolbox/mechanical = 1,
/obj/item/stack/tile/plasteel = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
time = 80
/datum/crafting_recipe/table/medbot
name = "Medbot"
result_path = /obj/machinery/bot/medbot
reqs = list(/obj/item/device/healthanalyzer = 1,
/obj/item/weapon/storage/firstaid = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
time = 80
/datum/crafting_recipe/table/flamethrower
name = "Flamethrower"
result_path = /obj/item/weapon/flamethrower
reqs = list(/obj/item/weapon/weldingtool = 1,
/obj/item/device/assembly/igniter = 1,
/obj/item/stack/rods = 2)
tools = list(/obj/item/weapon/screwdriver)
time = 20
/////////////////////////////////////////////////////////
/datum/crafting_controller
var/list/families = list()
var/list/all_crafting_points = list()
var/list/all_crafting_recipes = list()
/hook/startup/proc/setupCraftingMaster()
crafting_master = new /datum/crafting_controller()
return 1
/datum/crafting_controller/New()
crafting_master = src
add_family("table")
@@ -396,4 +308,4 @@ var/global/datum/crafting_controller/crafting_master
else
usr << "<span class ='warning'>Construction failed.</span>"
busy = 0
interact(usr)
interact(usr)
+112
View File
@@ -0,0 +1,112 @@
//Basic crafting components -- Using cheap easily found items to create components that can be used to make more complex objects
/datum/crafting_recipe/table/igniter
name = "Igniter"
result_path = /obj/item/device/assembly/igniter
reqs = list(/obj/item/weapon/lighter = 1,
/obj/item/stack/cable_coil = 1)
time = 20
/datum/crafting_recipe/table/voice
name = "Voice analyzer"
result_path = /obj/item/device/assembly/voice
reqs = list(/obj/item/device/taperecorder = 1,
/obj/item/stack/cable_coil = 1)
time = 20
/datum/crafting_recipe/table/infra
name = "Infrared Emitter"
result_path = /obj/item/device/assembly/infra
reqs = list(/obj/item/device/laser_pointer = 1,
/obj/item/stack/cable_coil = 1)
time = 20
//Medium crafting
/datum/crafting_recipe/table/IED
name = "IED"
result_path = /obj/item/weapon/grenade/iedcasing
reqs = list(/obj/item/stack/cable_coil = 1,
/obj/item/device/assembly/igniter = 1,
/obj/item/weapon/reagent_containers/food/drinks/cans = 1,
/datum/reagent/fuel = 10)
time = 80
/datum/crafting_recipe/table/stunprod
name = "Stunprod"
result_path = /obj/item/weapon/melee/baton/cattleprod
reqs = list(/obj/item/weapon/handcuffs/cable = 1,
/obj/item/stack/rods = 1,
/obj/item/weapon/wirecutters = 1,
/obj/item/weapon/cell = 1)
time = 80
parts = list(/obj/item/weapon/cell = 1)
/datum/crafting_recipe/table/flamethrower
name = "Flamethrower"
result_path = /obj/item/weapon/flamethrower
reqs = list(/obj/item/weapon/weldingtool = 1,
/obj/item/device/assembly/igniter = 1,
/obj/item/stack/rods = 2)
tools = list(/obj/item/weapon/screwdriver)
time = 20
//Advanced crafting
/datum/crafting_recipe/table/ed209
name = "ED209"
result_path = /obj/machinery/bot/ed209
reqs = list(/obj/item/robot_parts/robot_suit = 1,
/obj/item/clothing/head/helmet = 1,
/obj/item/clothing/suit/armor/vest = 1,
/obj/item/robot_parts/l_leg = 1,
/obj/item/robot_parts/r_leg = 1,
/obj/item/stack/sheet/metal = 5,
/obj/item/stack/cable_coil = 5,
/obj/item/weapon/gun/energy/taser = 1,
/obj/item/weapon/cell = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
tools = list(/obj/item/weapon/weldingtool, /obj/item/weapon/screwdriver)
time = 120
/datum/crafting_recipe/table/secbot
name = "Secbot"
result_path = /obj/machinery/bot/secbot
reqs = list(/obj/item/device/assembly/signaler = 1,
/obj/item/clothing/head/helmet = 1,
/obj/item/weapon/melee/baton = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
tools = list(/obj/item/weapon/weldingtool)
time = 120
/datum/crafting_recipe/table/cleanbot
name = "Cleanbot"
result_path = /obj/machinery/bot/cleanbot
reqs = list(/obj/item/weapon/reagent_containers/glass/bucket = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
time = 80
/datum/crafting_recipe/table/floorbot
name = "Floorbot"
result_path = /obj/machinery/bot/floorbot
reqs = list(/obj/item/weapon/storage/toolbox/mechanical = 1,
/obj/item/stack/tile/plasteel = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
time = 80
/datum/crafting_recipe/table/medbot
name = "Medbot"
result_path = /obj/machinery/bot/medbot
reqs = list(/obj/item/device/healthanalyzer = 1,
/obj/item/weapon/storage/firstaid = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
time = 80
/////////////////////////////////////////////////////////
+13 -1
View File
@@ -245,7 +245,8 @@ client
if(ismob(D))
body += "<option value='?_src_=vars;give_spell=\ref[D]'>Give Spell</option>"
body += "<option value='?_src_=vars;give_disease=\ref[D]'>Give Disease</option>"
body += "<option value='?_src_=vars;give_disease2=\ref[D]'>Give Disease</option>"
body += "<option value='?_src_=vars;give_disease=\ref[D]'>Give TG-style Disease</option>"
body += "<option value='?_src_=vars;godmode=\ref[D]'>Toggle Godmode</option>"
body += "<option value='?_src_=vars;build_mode=\ref[D]'>Toggle Build Mode</option>"
@@ -524,6 +525,17 @@ client
src.give_disease(M)
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["give_disease2"])
if(!check_rights(R_ADMIN|R_FUN)) return
var/mob/M = locate(href_list["give_disease2"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.give_disease2(M)
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["ninja"])
if(!check_rights(R_SPAWN)) return
+137
View File
@@ -0,0 +1,137 @@
/datum/disease/addiction
name = "Chemical Addiction"
max_stages = 5
spread = "None"
spread_type = SPECIAL
cure = "Unknown"
cure_id = list("fixer", "water")
cure_chance = 3
affected_species = list("Human", "Monkey", "Skrell", "Unathi", "Tajaran", "Kidan", "Grey")
var/datum/reagent/addicted_to
var/addiction
var/addiction_countdown = 1800 // Three minutes
/datum/disease/addiction/New()
if(addicted_to)
src.name = "[addicted_to.name] Addiction"
src.addiction ="[addicted_to.name]"
src.cure = addicted_to.id
//affected_mob.addictions += addicted_to
..()
/datum/disease/addiction/proc/has_addict_reagent()
var/result = 0
if(affected_mob.reagents.has_reagent(addicted_to))
result = 1
return result
/datum/disease/addiction/process()
if(!holder) return
var/addict_reagent_present = has_addict_reagent()
var/tickcount = 0
if(affected_mob)
for(var/datum/disease/D in affected_mob.viruses)
if(D != src)
if(istype(src, D.type))
if(istype(src.addicted_to, D:addicted_to)) // Allow for multiple addictions as long as each addiction is for a different reagent
del(src) // if there are somehow two viruses of the same kind in the system, delete the other one
if(holder == affected_mob)
if(affected_mob.stat < 2) //he's alive
if(addict_reagent_present) //he's taken the reagent to which he's addicted
stage = 1
tickcount++
if(prob(20))
affected_mob << "\blue You feel a wave of euphoria as [addiction] surges through your bloodstream..."
if(tickcount >= 900)
stage_act()
tickcount = 0
else //he's ignored his addiction or hasn't taken the reagent
stage_act()
else //he's dead.
if(spread_type!=SPECIAL)
spread_type = CONTACT_GENERAL
affected_mob = null
if(!affected_mob) //the virus is in inanimate obj
if(prob(70))
if(--longevity<=0)
cure(0)
return
/datum/disease/addiction/stage_act()
var/cure_present = has_cure()
var/addict_reagent_present = has_addict_reagent()
if(carrier&&!cure_present)
return
spread = (cure_present?"Remissive":initial(spread))
if(stage > max_stages)
stage = max_stages
if(stage_prob != 0 && prob(stage_prob) && stage != max_stages && !cure_present && !addict_reagent_present) //now the disease shouldn't get back up to stage 4 in no time
stage++
if(stage != 1 && (prob(1) || (cure_present && prob(cure_chance))))
stage--
else if(stage <= 1 && ((prob(1) && curable) || (cure_present && prob(cure_chance))))
cure()
return
switch(stage)
if(2)
if(prob(5))
affected_mob << "\red You can't stop thinking about [addiction]!"
if(affected_mob.sleeping && prob(1))
affected_mob << "\blue You feel better."
stage--
if(prob(1))
if(prob(1))
stage--
if(3)
if(prob(5))
affected_mob << "\red You gotta have some [addiction]!"
if(affected_mob.sleeping && prob(1))
affected_mob << "\blue You feel better."
stage--
if(prob(1))
if(prob(1))
stage--
if(4)
if(prob(7))
affected_mob << "\red Gotta have some [addiction]!"
if(prob(10))
affected_mob.take_organ_damage(1)
if(prob(2))
affected_mob << "\red Your stomach hurts."
if(prob(5))
affected_mob.emote("blink")
if(prob(10))
affected_mob.toxloss += 1
affected_mob.updatehealth()
if(affected_mob.sleeping && prob(1))
affected_mob << "\blue You feel better."
stage--
if(prob(1))
if(prob(1))
stage--
if(5)
if(prob(5))
affected_mob << "\red \bold You can't stand not having [addiction]!"
if(prob(20))
affected_mob.toxloss += 2
affected_mob.updatehealth()
if(prob(2))
affected_mob << "\red \bold [addiction] calls out to your mind!"
for(var/mob/O in viewers(affected_mob, null))
O.show_message(text("\red [] rakes at their eyes!", affected_mob), 1)
affected_mob.eye_blind = 2
affected_mob.eye_blurry = 3
if(prob(1))
affected_mob.emote("twitch")
if(affected_mob.sleeping && prob(1))
affected_mob << "\blue You feel better."
stage--
if(prob(1))
if(prob(1))
stage--
+13
View File
@@ -162,6 +162,11 @@
teleatom.visible_message("\red <B>The [teleatom] bounces off of the portal!</B>")
return 0
if(istype(teleatom, /obj/item/flag/nation)) // Don't let nuke disks get teleported --NeoFite
teleatom.visible_message("\red <B>The [teleatom] bounces off of the portal!</B>")
return 0
if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/disk/nuclear)))
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
@@ -170,6 +175,14 @@
teleatom.visible_message("\red <B>The [teleatom] bounces off of the portal!</B>")
return 0
if(!isemptylist(teleatom.search_contents_for(/obj/item/flag/nation)))
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
MM.visible_message("\red <B>The [MM] bounces off of the portal!</B>","\red Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through.")
else
teleatom.visible_message("\red <B>The [teleatom] bounces off of the portal!</B>")
return 0
if(destination.z == 2) //centcomm z-level
if(istype(teleatom, /obj/mecha))
var/obj/mecha/MM = teleatom
+1 -1
View File
@@ -52,7 +52,7 @@ datum/mind
var/datum/faction/faction //associated faction
var/datum/changeling/changeling //changeling holder
var/datum/nations/nation //associated nation for CTF
var/datum/vampire/vampire //vampire holder
var/rev_cooldown = 0
+8 -7
View File
@@ -18,10 +18,14 @@
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded
for(var/mob/living/target in targets)
spawn(0)
var/mobloc
var/originalloc = get_turf(target.loc)
var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( originalloc )
var/atom/movable/overlay/animation = new /atom/movable/overlay( originalloc )
if(target.buckled)
var/obj/structure/stool/bed/buckled_to = target.buckled.
buckled_to.unbuckle()
var/mobloc = get_turf(target.loc)
var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( mobloc )
var/atom/movable/overlay/animation = new /atom/movable/overlay( mobloc )
animation.name = "water"
animation.density = 0
animation.anchored = 1
@@ -39,9 +43,6 @@
target.client.eye = holder
sleep(jaunt_duration)
mobloc = get_turf(target.loc)
if(get_area(mobloc) == /area/security/armoury/gamma)
target << "A strange energy repels you!"
mobloc = originalloc
animation.loc = mobloc
target.canmove = 0
sleep(20)
+2 -2
View File
@@ -174,7 +174,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
containername = "Emergency Crate"
group = "Engineering"
/datum/supply_packs/evacuation
/datum/supply_packs/inflatable
name = "Inflatable barriers"
contains = list(/obj/item/weapon/storage/briefcase/inflatable,
/obj/item/weapon/storage/briefcase/inflatable,
@@ -1074,4 +1074,4 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
cost = 15
containertype = /obj/structure/closet/crate
containername = "mafia supply crate"
group = "Operations"
group = "Operations"
+12 -5
View File
@@ -47,9 +47,11 @@ var/list/uplink_items = list()
var/list/job = null
/datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/device/uplink/U)
U.uses -= max(cost, 0)
feedback_add_details("traitor_uplink_items_bought", name)
return new item(loc)
if(item)
U.uses -= max(cost, 0)
U.used_TC += cost
feedback_add_details("traitor_uplink_items_bought", name)
return new item(loc)
/datum/uplink_item/proc/buy(var/obj/item/device/uplink/hidden/U, var/mob/user)
@@ -74,7 +76,12 @@ var/list/uplink_items = list()
if(ishuman(user))
var/mob/living/carbon/human/A = user
A.put_in_any_hand_if_possible(I)
U.purchase_log += "[user] ([user.ckey]) bought [name] for [cost]."
if(istype(I,/obj/item/weapon/storage/box/) && I.contents.len>0)
for(var/atom/o in I)
U.purchase_log += "<BIG>\icon[o]</BIG>"
else
U.purchase_log += "<BIG>\icon[I]</BIG>"
U.interact(user)
return 1
@@ -481,4 +488,4 @@ var/list/uplink_items = list()
var/datum/uplink_item/I = pick(possible_items)
U.uses -= max(0, I.cost)
feedback_add_details("traitor_uplink_items_bought","RN")
return new I.item(loc)
return new I.item(loc)
+6
View File
@@ -1153,6 +1153,7 @@
name = "pack of coffee arabica seeds"
desc = "These seeds grow into coffee arabica bushes."
icon_state = "seed-coffeea"
mypath = "/obj/item/seeds/coffee_arabica_seed"
species = "coffeea"
plantname = "Coffee Arabica Bush"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/coffee_arabica"
@@ -1170,6 +1171,7 @@
name = "pack of coffee robusta seeds"
desc = "These seeds grow into coffee robusta bushes."
icon_state = "seed-coffeer"
mypath = "/obj/item/seeds/coffee_robusta_seed"
species = "coffeer"
plantname = "Coffee Robusta Bush"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/coffee_robusta"
@@ -1186,6 +1188,7 @@
name = "pack of tobacco seeds"
desc = "These seeds grow into tobacco plants."
icon_state = "seed-tobacco"
mypath = "/obj/item/seeds/tobacco_seed"
species = "tobacco"
plantname = "Tobacco Plant"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/tobacco"
@@ -1204,6 +1207,7 @@
name = "pack of space tobacco seeds"
desc = "These seeds grow into space tobacco plants."
icon_state = "seed-stobacco"
mypath = "/obj/item/seeds/tobacco_space_seed"
species = "stobacco"
plantname = "Space Tobacco Plant"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/tobacco_space"
@@ -1221,6 +1225,7 @@
name = "pack of tea aspera seeds"
desc = "These seeds grow into tea plants."
icon_state = "seed-teaaspera"
mypath = "/obj/item/seeds/tea_aspera_seed"
species = "teaaspera"
plantname = "Tea Aspera Plant"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/tea_aspera"
@@ -1238,6 +1243,7 @@
name = "pack of tea astra seeds"
desc = "These seeds grow into tea plants."
icon_state = "seed-teaastra"
mypath = "/obj/item/seeds/tea_astra_seed"
species = "teaastra"
plantname = "Tea Astra Plant"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/tea_astra"
+71 -2
View File
@@ -526,6 +526,10 @@ var/list/ghostteleportlocs = list()
name = "\improper Thunderdome (Observer.)"
icon_state = "purple"
/area/exploration/methlab
name = "\improper Abandoned Drug Lab"
icon_state = "green"
//ENEMY
//names are used
@@ -1562,11 +1566,11 @@ var/list/ghostteleportlocs = list()
//DJSTATION
/area/djstation
name = "\improper Ruskie DJ Station"
name = "\improper Listening Post"
icon_state = "DJ"
/area/djstation/solars
name = "\improper DJ Station Solars"
name = "\improper Listening Post Solars"
icon_state = "DJ"
//DERELICT
@@ -1657,6 +1661,71 @@ var/list/ghostteleportlocs = list()
name = "\improper Derelict Singularity Engine"
icon_state = "engine"
//HALF-BUILT STATION (REPLACES DERELICT IN BAYCODE, ABOVE IS LEFT FOR DOWNSTREAM)
/area/shuttle/constructionsite
name = "\improper Construction Site Shuttle"
icon_state = "yellow"
/area/shuttle/constructionsite/station
name = "\improper Construction Site Shuttle"
/area/shuttle/constructionsite/site
name = "\improper Construction Site Shuttle"
/area/constructionsite
name = "\improper Construction Site"
icon_state = "storage"
/area/constructionsite/storage
name = "\improper Construction Site Storage Area"
/area/constructionsite/science
name = "\improper Construction Site Research"
/area/constructionsite/bridge
name = "\improper Construction Site Bridge"
icon_state = "bridge"
/area/constructionsite/maintenance
name = "\improper Construction Site Maintenance"
icon_state = "yellow"
/area/constructionsite/hallway/aft
name = "\improper Construction Site Aft Hallway"
icon_state = "hallP"
/area/constructionsite/hallway/fore
name = "\improper Construction Site Fore Hallway"
icon_state = "hallS"
/area/constructionsite/atmospherics
name = "\improper Construction Site Atmospherics"
icon_state = "green"
/area/constructionsite/medical
name = "\improper Construction Site Medbay"
icon_state = "medbay"
/area/constructionsite/ai
name = "\improper Construction Computer Core"
icon_state = "ai"
/area/constructionsite/engineering
name = "\improper Construction Site Engine Bay"
icon_state = "engine"
/area/solar/constructionsite
name = "\improper Construction Site Solars"
icon_state = "aft"
//area/constructionsite
// name = "\improper Construction Site Shuttle"
//area/constructionsite
// name = "\improper Construction Site Shuttle"
//Construction
/area/construction
+5 -34
View File
@@ -16,6 +16,7 @@
var/implant=null
var/ckey=null
var/mind=null
var/languages=null
/datum/dna2/record/proc/GetData()
var/list/ser=list("data" = null, "owner" = null, "label" = null, "type" = null, "ue" = 0)
@@ -160,6 +161,8 @@
return
visible_message("[user] puts [L.name] into the DNA Scanner.", 3)
put_in(L)
if(user.pulling == L)
user.pulling = null
/obj/machinery/dna_scannernew/attackby(var/obj/item/weapon/item as obj, var/mob/user as mob)
if (istype(item, /obj/item/weapon/screwdriver))
@@ -289,6 +292,7 @@
icon = 'icons/obj/computer.dmi'
icon_state = "scanner"
density = 1
circuit = /obj/item/weapon/circuitboard/scan_consolenew
var/selected_ui_block = 1.0
var/selected_ui_subblock = 1.0
var/selected_se_block = 1.0
@@ -310,32 +314,6 @@
var/waiting_for_user_input=0 // Fix for #274 (Mash create block injector without answering dialog to make unlimited injectors) - N3X
/obj/machinery/computer/scan_consolenew/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/weapon/screwdriver))
playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20))
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
getFromPool(/obj/item/weapon/shard, loc)
var/obj/item/weapon/circuitboard/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 3
A.icon_state = "3"
A.anchored = 1
del(src)
else
user << "\blue You disconnect the monitor."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 4
A.icon_state = "4"
A.anchored = 1
del(src)
if (istype(I, /obj/item/weapon/disk/data)) //INSERT SOME diskS
if (!src.disk)
user.drop_item()
@@ -345,7 +323,7 @@
nanomanager.update_uis(src) // update all UIs attached to src()
return
else
src.attack_hand(user)
..()
return
/obj/machinery/computer/scan_consolenew/ex_act(severity)
@@ -408,13 +386,6 @@
I.buf = buffer
return 1
/obj/machinery/computer/scan_consolenew/attackby(obj/item/W as obj, mob/user as mob)
if ((istype(W, /obj/item/weapon/disk/data)) && (!src.disk))
user.drop_item()
W.loc = src
src.disk = W
user << "You insert [W]."
nanomanager.update_uis(src) // update all UIs attached to src()
/*
/obj/machinery/computer/scan_consolenew/process() //not really used right now
if(stat & (NOPOWER|BROKEN))
@@ -434,6 +434,86 @@
//Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay.
/*
/mob/verb/honk()
set name = "OH HOLY FUCK"
set category = "Debug"
var/yes = 0
if(src in mob_list)
yes = 1
else
var/mob/M = locate(src) in mob_list
if(M == src)
yes = 1
usr << "[yes ? "\blue" : "\red"] You are [yes ? "" : "not "]in the mob list"
*/
/mob/proc/changeling_returntolife()
set category = "Changeling"
set name = "Return To Life (20)"
var/datum/changeling/changeling = changeling_power(20,1,100,DEAD)
if(!changeling) return
var/mob/living/carbon/C = src
if(changeling_power(20,1,100,DEAD))
changeling.chem_charges -= 20
dead_mob_list -= C
living_mob_list |= C
C.stat = CONSCIOUS
C.tod = null
C.setToxLoss(0)
C.setOxyLoss(0)
C.setCloneLoss(0)
C.setBrainLoss(0)
C.SetParalysis(0)
C.SetStunned(0)
C.SetWeakened(0)
C.radiation = 0
C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss())
C.reagents.clear_reagents()
C.germ_level = 0
C.next_pain_time = 0
C.traumatic_shock = 0
if(ishuman(C))
var/mob/living/carbon/human/H = C
H.vessel.reagent_list = list()
H.vessel.add_reagent("blood",560)
H.shock_stage = 0
spawn(1)
H.fixblood()
for(var/organ_name in H.organs_by_name)
var/datum/organ/external/O = H.organs_by_name[organ_name]
for(var/obj/item/weapon/shard/shrapnel/s in O.implants)
if(istype(s))
O.implants -= s
H.contents -= s
del(s)
O.amputated = 0
O.brute_dam = 0
O.burn_dam = 0
O.damage_state = "00"
O.germ_level = 0
O.hidden = null
O.number_wounds = 0
O.open = 0
O.perma_injury = 0
O.stage = 0
O.status = 0
O.trace_chemicals = list()
O.wounds = list()
O.wound_update_accuracy = 1
for(var/organ_name in H.internal_organs)
var/datum/organ/internal/IO = H.internal_organs[organ_name]
IO.damage = 0
IO.trace_chemicals = list()
H.updatehealth()
C << "<span class='notice'>We have regenerated.</span>"
C.visible_message("<span class='warning'>[src] appears to wake from the dead, having healed all wounds.</span>")
C.status_flags &= ~(FAKEDEATH)
C.update_canmove()
C.make_changeling()
src.verbs -= /mob/proc/changeling_returntolife
feedback_add_details("changeling_powers","RJ")
/mob/proc/changeling_fakedeath()
set category = "Changeling"
set name = "Regenerative Stasis (20)"
@@ -453,80 +533,9 @@
C.emote("gasp")
C.tod = worldtime2text()
spawn(rand(800,2000))
if(changeling_power(20,1,100,DEAD))
// charge the changeling chemical cost for stasis
changeling.chem_charges -= 20
// shut down various types of badness
C.setToxLoss(0)
C.setOxyLoss(0)
C.setCloneLoss(0)
C.setBrainLoss(0)
C.SetParalysis(0)
C.SetStunned(0)
C.SetWeakened(0)
// shut down ongoing problems
C.radiation = 0
C.nutrition = 400
C.bodytemperature = 310
C.sdisabilities = 0
C.disabilities = 0
C.blinded = 0
// fix blindness and deafness
C.eye_blind = 0
C.eye_blurry = 0
C.ear_deaf = 0
C.ear_damage = 0
// head actual damage numbers
C.heal_overall_damage(1000, 1000)
// get rid of the reagents
C.reagents.clear_reagents()
// cure diseases
for(var/datum/disease/D in viruses)
D.cure(0)
// fix all the organs
C.restore_all_organs()
// restore blood
if(ishuman(C))
var/mob/living/carbon/human/human_mob = C
human_mob.restore_blood()
// remove the character from the list of the dead
if(C.stat == 2)
dead_mob_list -= src
living_mob_list += src
// make us conscious again
C.stat = CONSCIOUS
// remove the time of death
C.tod = null
// fix all the icons
C.regenerate_icons()
// remove our fake death flag
C.status_flags &= ~(FAKEDEATH)
// let us move again
C.update_canmove()
// re-add out changeling powers
C.make_changeling()
// sending display messages
C << "<span class='notice'>We have regenerated.</span>"
C.visible_message("<span class='warning'>[src] appears to wake from the dead, having healed all wounds.</span>")
spawn(rand(800,1200))
src << "<span class='warning'>We are now ready to regenerate.</span>"
src.verbs += /mob/proc/changeling_returntolife
feedback_add_details("changeling_powers","FD")
return 1
+3
View File
@@ -92,6 +92,9 @@ Implants;
return 1
return 0
//pre_pre_setup() For when you really don't want certain jobs ingame.
/datum/game_mode/proc/pre_pre_setup()
return 1
///pre_setup()
///Attempts to select players for special roles the mode might have.
+20 -6
View File
@@ -10,7 +10,7 @@ var/global/datum/controller/gameticker/ticker
var/const/restart_timeout = 600
var/current_state = GAME_STATE_PREGAME
var/hide_mode = 1
var/hide_mode = 0 // leave here at 0 ! setup() will take care of it when needed for Secret mode -walter0o
var/datum/game_mode/mode = null
var/event_time = null
var/event = 0
@@ -103,6 +103,7 @@ var/global/datum/controller/gameticker/ticker
return 0
//Configure mode and assign player to special mode stuff
src.mode.pre_pre_setup()
job_master.DivideOccupations() //Distribute jobs
var/can_continue = src.mode.pre_setup()//Setup special modes
if(!can_continue)
@@ -140,15 +141,18 @@ var/global/datum/controller/gameticker/ticker
//Deleting Startpoints but we need the ai point to AI-ize people later
if (S.name != "AI")
del(S)
// take care of random spesspod spawning
var/list/obj/effect/landmark/spacepod/random/L = list()
for(var/obj/effect/landmark/spacepod/random/SS in landmarks_list)
if(istype(SS))
L += SS
var/obj/effect/landmark/spacepod/random/S = pick(L)
new /obj/spacepod/random(S.loc)
for(var/obj in L)
if(istype(obj, /obj/effect/landmark/spacepod/random))
del(obj)
if(L.len)
var/obj/effect/landmark/spacepod/random/S = pick(L)
new /obj/spacepod/random(S.loc)
for(var/obj/effect/landmark/spacepod/random/R in L)
del(R)
world << "<FONT color='blue'><B>Enjoy the game!</B></FONT>"
world << sound('sound/AI/welcome.ogg') // Skie
//Holiday Round-start stuff ~Carn
@@ -435,7 +439,14 @@ var/global/datum/controller/gameticker/ticker
robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.key]), ":" (Played by: [robo.key]), "]"
world << "[robolist]"
var/dronecount = 0
for (var/mob/living/silicon/robot/robo in mob_list)
if(istype(robo,/mob/living/silicon/robot/drone))
dronecount++
continue
if (!robo.connected_ai)
if (robo.stat != 2)
world << "<b>[robo.name] (Played by: [robo.key]) survived as an AI-less borg! Its laws were:</b>"
@@ -445,6 +456,9 @@ var/global/datum/controller/gameticker/ticker
if(robo) //How the hell do we lose robo between here and the world messages directly above this?
robo.laws.show_laws(world)
if(dronecount)
world << "<b>There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round."
mode.declare_completion()//To declare normal completion.
mode.declare_job_completion()
+3
View File
@@ -21,6 +21,9 @@ datum/directive
proc/initialize()
return 1
proc/get_remaining_orders()
return ""
/proc/get_directive(type)
var/datum/game_mode/mutiny/mode = get_mutiny_mode()
if(!mode || !mode.current_directive || !istype(mode.current_directive, text2path("/datum/directive/[type]")))
@@ -4,18 +4,22 @@ datum/directive/terminations/alien_fraud
"Transfer their payrolls to the station account.",
"Terminate their employment.")
proc/is_alien(mob/M)
var/species = M.get_species()
return species == "Tajaran" || species == "Unathi"
datum/directive/terminations/alien_fraud/get_crew_to_terminate()
var/list/aliens[0]
for(var/mob/living/carbon/human/H in player_list)
if (H.species.name == "Tajaran" || H.species.name == "Unathi")
aliens+=H
for(var/mob/M in player_list)
if (is_alien(M) && M.is_ready())
aliens+=(M)
return aliens
datum/directive/terminations/alien_fraud/get_description()
return {"
<p>
An extensive conspiracy network aimed at defrauding NanoTrasen of large amounts of funds has been uncovered
operating within Tau Ceti. Human personnel are not suspected to be involved. Further information is classified.
operating within [system_name()]. Human personnel are not suspected to be involved. Further information is classified.
</p>
"}
@@ -24,10 +28,11 @@ datum/directive/terminations/alien_fraud/meets_prerequisites()
// of the Tajarans and Unathi combined can't be more than 1/3rd of the crew.
var/tajarans = 0
var/unathi = 0
for(var/mob/living/carbon/human/H in player_list)
if (H.species.name == "Tajaran")
for(var/mob/M in player_list)
var/species = M.get_species()
if(species == "Tajaran")
tajarans++
if (H.species.name == "Unathi")
if(species == "Unathi")
unathi++
if (!tajarans || !unathi)
@@ -1,9 +1,15 @@
#define INFECTION_COUNT 5
datum/directive/bluespace_contagion
var/infection_count = 5
var/list/infected = list()
proc/get_infection_candidates()
var/list/candidates[0]
for(var/mob/M in player_list)
if (!M.is_mechanical() && M.is_ready())
candidates+=(M)
return candidates
datum/directive/bluespace_contagion/get_description()
return {"
<p>
@@ -14,13 +20,13 @@ datum/directive/bluespace_contagion/get_description()
"}
datum/directive/bluespace_contagion/initialize()
var/list/candidates = player_list.Copy()
var/list/candidates = get_infection_candidates()
var/list/infected_names = list()
for(var/i=0, i < INFECTION_COUNT, i++)
if(!candidates.len)
break
var/mob/living/carbon/human/candidate = pick(candidates)
var/mob/candidate = pick(candidates)
candidates-=candidate
infected+=candidate
infected_names+="[candidate.mind.assigned_role] [candidate.mind.name]"
@@ -31,11 +37,18 @@ datum/directive/bluespace_contagion/initialize()
"If no cure arrives after that time, execute the infected.")
datum/directive/bluespace_contagion/meets_prerequisites()
return player_list.len >= 7
var/list/candidates = get_infection_candidates()
return candidates.len >= 7
datum/directive/bluespace_contagion/directives_complete()
return infected.len == 0
datum/directive/bluespace_contagion/get_remaining_orders()
var/text = ""
for(var/victim in infected)
text += "<li>Kill [victim]</li>"
return text
/hook/death/proc/infected_killed(mob/living/carbon/human/deceased, gibbed)
var/datum/directive/bluespace_contagion/D = get_directive("bluespace_contagion")
if(!D) return 1
@@ -7,15 +7,15 @@ datum/directive/terminations/financial_crisis
datum/directive/terminations/financial_crisis/get_crew_to_terminate()
var/list/civilians[0]
var/list/candidates = civilian_positions - "Head of Personnel"
for(var/mob/living/carbon/human/H in player_list)
if (candidates.Find(H.mind.assigned_role))
civilians+=H
for(var/mob/M in player_list)
if (candidates.Find(M.mind.assigned_role) && M.is_ready())
civilians+=(M)
return civilians
datum/directive/terminations/financial_crisis/get_description()
return {"
<p>
Tau Ceti system banks in financial crisis. Local emergency situation ongoing.
[system_name()] system banks in financial crisis. Local emergency situation ongoing.
NT Funds redistributed, impact upon civilian department expected.
Further information is classified.
</p>
@@ -15,16 +15,16 @@ datum/directive/ipc_virus
proc/get_ipcs()
var/list/machines[0]
for(var/mob/living/carbon/human/H in player_list)
if (H.species.name == "Machine")
machines+=H
for(var/mob/M in player_list)
if (M.get_species() == "Machine" && M.is_ready())
machines+=(M)
return machines
proc/get_roboticists()
var/list/roboticists[0]
for(var/mob/living/carbon/human/H in player_list)
if (roboticist_roles.Find(H.mind.assigned_role))
roboticists+=H
for(var/mob/M in player_list)
if (roboticist_roles.Find(M.mind.assigned_role) && M.is_ready())
roboticists+=(M)
return roboticists
datum/directive/ipc_virus/initialize()
@@ -37,7 +37,7 @@ datum/directive/ipc_virus/get_description()
return {"
<p>
IPC units have been found to be infected with a violent and undesired virus in Virgus Ferrorus system.
Risk to NSS Exodus IPC units has not been assessed. Further information is classified.
Risk to [station_name()] IPC units has not been assessed. Further information is classified.
</p>
"}
@@ -49,6 +49,19 @@ datum/directive/ipc_virus/meets_prerequisites()
datum/directive/ipc_virus/directives_complete()
return brains_to_enslave.len == 0 && cyborgs_to_make.len == 0 && ids_to_terminate.len == 0
datum/directive/ipc_virus/get_remaining_orders()
var/text = ""
for(var/brain in brains_to_enslave)
text += "<li>Debrain [brain]</li>"
for(var/brain in cyborgs_to_make)
text += "<li>Enslave [brain] as a Cyborg</li>"
for(var/id in ids_to_terminate)
text += "<li>Terminate [id]</li>"
return text
/hook/debrain/proc/debrain_directive(obj/item/brain/B)
var/datum/directive/ipc_virus/D = get_directive("ipc_virus")
if (!D) return 1
@@ -4,11 +4,14 @@ datum/directive/research_to_ripleys
var/list/ids_to_reassign = list()
var/materials_shipped = 0
proc/is_researcher(mob/M)
return M.mind.assigned_role in science_positions - "Research Director"
proc/get_researchers()
var/list/researchers[0]
for(var/mob/living/carbon/human/H in player_list)
if (H.mind.assigned_role in science_positions - "Research Director")
researchers+=H
for(var/mob/M in player_list)
if (is_researcher(M) && M.is_ready())
researchers+=(M)
return researchers
proc/count_researchers_reassigned()
@@ -22,7 +25,7 @@ datum/directive/research_to_ripleys
datum/directive/research_to_ripleys/get_description()
return {"
<p>
The NanoTrasen Tau Ceti Manufactory faces an ore deficit. Financial crisis imminent. [station_name()] has been reassigned as a mining platform.
The NanoTrasen [system_name()] Manufactory faces an ore deficit. Financial crisis imminent. [station_name()] has been reassigned as a mining platform.
The Research Director is to assist the Head of Personnel in coordinating assets.
Weapons department reports solid sales. Further information is classified.
</p>
@@ -44,6 +47,17 @@ datum/directive/research_to_ripleys/directives_complete()
if (materials_shipped < MATERIALS_REQUIRED) return 0
return count_researchers_reassigned() == ids_to_reassign.len
datum/directive/research_to_ripleys/get_remaining_orders()
var/text = ""
if(MATERIALS_REQUIRED > materials_shipped)
text += "<li>Ship [MATERIALS_REQUIRED - materials_shipped] sheets of metal or minerals.</li>"
for(var/id in ids_to_reassign)
if(!ids_to_reassign[id])
text += "<li>Reassign [id] to Shaft Miner</li>"
return text
/hook/reassign_employee/proc/research_reassignments(obj/item/weapon/card/id/id_card)
var/datum/directive/research_to_ripleys/D = get_directive("research_to_ripleys")
if(!D) return 1
@@ -4,27 +4,32 @@ datum/directive/tau_ceti_needs_women
proc/get_target_gender()
if(!mode.head_loyalist) return FEMALE
return mode.head_loyalist.current.gender == FEMALE ? MALE : FEMALE
return mode.head_loyalist.current.get_gender() == FEMALE ? MALE : FEMALE
proc/is_target_gender(mob/M)
var/species = M.get_species()
return species != "Diona" && M.get_gender() == get_target_gender()
proc/get_crew_of_target_gender()
var/list/targets[0]
for(var/mob/living/carbon/human/H in player_list)
if(H.species.name != "Machine" && H.gender == get_target_gender())
targets+=H
for(var/mob/M in player_list)
if(is_target_gender(M) && !M.is_mechanical() && M.is_ready())
targets+=(M)
return targets
proc/get_target_heads()
var/list/heads[0]
for(var/mob/living/carbon/human/H in get_crew_of_target_gender())
if(command_positions.Find(H.mind.assigned_role))
heads+=H
for(var/mob/M in get_crew_of_target_gender())
if(command_positions.Find(M.mind.assigned_role))
heads+=(M)
return heads
proc/get_target_aliens()
var/list/aliens[0]
for(var/mob/living/carbon/human/H in get_crew_of_target_gender())
if (H.species.name == "Tajaran" || H.species.name == "Unathi" || H.species.name == "Skrell")
aliens+=H
for(var/mob/M in get_crew_of_target_gender())
var/species = M.get_species()
if(species == "Tajaran" || species == "Unathi" || species == "Skrell")
aliens+=(M)
return aliens
proc/count_heads_reassigned()
@@ -38,7 +43,7 @@ datum/directive/tau_ceti_needs_women
datum/directive/tau_ceti_needs_women/get_description()
return {"
<p>
Recent evidence suggests [get_target_gender()] aptitudes may be effected by radiation from Tau Ceti.
Recent evidence suggests [get_target_gender()] aptitudes may be effected by radiation from [system_name()].
Effects were measured under laboratory and station conditions. Humans remain more trusted than Xeno. Further information is classified.
</p>
"}
@@ -55,12 +60,32 @@ datum/directive/tau_ceti_needs_women/initialize()
"Terminate employment of all [get_target_gender()] Skrell, Tajara, and Unathi.")
datum/directive/tau_ceti_needs_women/meets_prerequisites()
var/list/targets = get_crew_of_target_gender()
return targets.len >= 3
var/females = 0
var/males = 0
for(var/mob/M in player_list)
if(!M.is_mechanical() && M.get_species() != "Diona" && M.is_ready())
var/gender = M.get_gender()
if(gender == MALE)
males++
else if(gender == FEMALE)
females++
return males >= 2 && females >= 2
datum/directive/tau_ceti_needs_women/directives_complete()
return command_targets.len == count_heads_reassigned() && alien_targets.len == 0
datum/directive/tau_ceti_needs_women/get_remaining_orders()
var/text = ""
for(var/head in command_targets)
if(!command_targets[head])
text += "<li>Remove [head] from a Head Role</li>"
for(var/id in alien_targets)
text += "<li>Terminate [id]</li>"
return text
/hook/reassign_employee/proc/command_reassignments(obj/item/weapon/card/id/id_card)
var/datum/directive/tau_ceti_needs_women/D = get_directive("tau_ceti_needs_women")
if(!D) return 1
@@ -22,11 +22,26 @@ datum/directive/terminations/directives_complete()
return ids_to_terminate.len == 0
datum/directive/terminations/initialize()
for(var/mob/living/carbon/human/A in get_crew_to_terminate())
var/datum/money_account/account = A.mind.initial_account
for(var/mob/living/carbon/human/H in get_crew_to_terminate())
var/datum/money_account/account = H.mind.initial_account
accounts_to_revoke["[account.account_number]"] = 0
accounts_to_suspend["[account.account_number]"] = account.suspended
ids_to_terminate+=A.wear_id
ids_to_terminate+=(H.wear_id)
datum/directive/terminations/get_remaining_orders()
var/text = ""
for(var/account_number in accounts_to_suspend)
if(!accounts_to_suspend[account_number])
text += "<li>Suspend Account #[account_number]</li>"
for(var/account_number in accounts_to_revoke)
if(!accounts_to_revoke[account_number])
text += "<li>Revoke Account #[account_number]</li>"
for(var/id in ids_to_terminate)
text += "<li>Terminate [id]</li>"
return text
/hook/revoke_payroll/proc/payroll_directive(datum/money_account/account)
var/datum/directive/terminations/D = get_directive("terminations")
@@ -7,8 +7,8 @@ datum/directive/terminations/test
datum/directive/terminations/test/get_crew_to_terminate()
var/list/uglies[0]
for(var/mob/living/carbon/human/H in player_list)
uglies+=H
for(var/mob/M in player_list)
uglies+=(M)
return uglies
datum/directive/terminations/test/get_description()
@@ -43,7 +43,7 @@
return
if(!mode.current_directive.directives_complete())
state("Command aborted. Communication with CentComm is prohibited until Directive X has been completed.")
state("Command aborted. Communication with CentCom is prohibited until Directive X has been completed.")
return
check_key_existence()
+34 -74
View File
@@ -54,8 +54,9 @@ datum/game_mode/mutiny
proc/get_directive_candidates()
var/list/candidates[0]
for(var/T in typesof(/datum/directive) - /datum/directive)
for(var/T in (typesof(/datum/directive) - /datum/directive))
var/datum/directive/D = new T(src)
// world << D.name
if (D.meets_prerequisites())
candidates+=D
return candidates
@@ -86,18 +87,29 @@ datum/game_mode/mutiny
"right hand" = slot_r_hand)
proc/equip_head_loyalist()
var/mob/living/carbon/human/H = head_loyalist.current
captains_key = new(H)
H.equip_in_one_of_slots(captains_key, get_equipment_slots())
H.update_icons()
H.verbs += /mob/living/carbon/human/proc/recruit_loyalist
equip_head(head_loyalist, "loyalist", /mob/living/carbon/human/proc/recruit_loyalist)
proc/equip_head_mutineer()
var/mob/living/carbon/human/H = head_mutineer.current
secondary_key = new(H)
H.equip_in_one_of_slots(secondary_key, get_equipment_slots())
equip_head(head_mutineer, "mutineer", /mob/living/carbon/human/proc/recruit_mutineer)
proc/equip_head(datum/mind/head, faction, proc/recruitment_verb)
var/mob/living/carbon/human/H = head.current
H << "You are the Head [capitalize(faction)]!"
head.special_role = "head_[faction]"
var/slots = get_equipment_slots()
switch(faction)
if("loyalist")
if(captains_key) del(captains_key)
captains_key = new(H)
H.equip_in_one_of_slots(captains_key, slots)
if("mutineer")
if(secondary_key) del(secondary_key)
secondary_key = new(H)
H.equip_in_one_of_slots(secondary_key, slots)
H.update_icons()
H.verbs += /mob/living/carbon/human/proc/recruit_mutineer
H.verbs += recruitment_verb
proc/add_loyalist(datum/mind/M)
add_faction(M, "loyalist", loyalists)
@@ -149,6 +161,14 @@ datum/game_mode/mutiny
var/obj/machinery/door/airlock/vault = locate(/obj/machinery/door/airlock/vault)
vault.locked = 0
proc/make_secret_transcript()
var/obj/machinery/computer/telecomms/server/S = locate(/obj/machinery/computer/telecomms/server)
if(!S) return
var/obj/item/weapon/paper/crumpled/bloody/transcript = new(S.loc)
transcript.name = "secret transcript"
transcript.info = fluff.secret_transcript()
proc/can_be_recruited(datum/mind/M, role)
if(!M) return 0
if(!M.special_role) return 1
@@ -208,65 +228,23 @@ datum/game_mode/mutiny
return 1
proc/check_antagonists_ui(admins)
var/turf/captains_key_loc = captains_key ? captains_key.get_loc_turf() : "Lost or Destroyed"
var/turf/secondary_key_loc = secondary_key ? secondary_key.get_loc_turf() : "Lost or Destroyed"
var/txt = {"
<h5>Context:</h5>
<p>
[current_directive.get_description()]
</p>
<h5>Orders:</h5>
<ol>
[fluff.get_orders()]
</ol>
<br>
<h5>Authentication:</h5>
<b>Captain's Key:</b> [captains_key_loc]
<a href='?src=\ref[admins];choice=activate_captains_key'>Activate</a><br>
<b>Secondary Key:</b> [secondary_key_loc]
<a href='?src=\ref[admins];choice=activate_secondary_key'>Activate</a><br>
<b>EAD: [ead ? ead.get_status() : "Lost or Destroyed"]</b>
<a href='?src=\ref[admins];choice=activate_ead'>Activate</a><br>
<hr>
"}
if(head_loyalist)
txt += check_role_table("Head Loyalist", list(head_loyalist), admins, 0)
var/list/loyal_crew = loyalists - head_loyalist
if(loyal_crew.len)
txt += check_role_table("Loyalists", loyal_crew, admins, 0)
if(head_mutineer)
txt += check_role_table("Head Mutineer", list(head_mutineer), admins, 0)
var/list/mutiny_crew = mutineers - head_mutineer
if(mutiny_crew.len)
txt += check_role_table("Mutineers", mutiny_crew, admins, 0)
if(body_count.len)
txt += check_role_table("Casualties", body_count, admins, 0)
return txt
/datum/game_mode/mutiny/announce()
fluff.announce()
/datum/game_mode/mutiny/pre_setup()
var/list/loyalist_candidates = get_head_loyalist_candidates()
if(!loyalist_candidates || loyalist_candidates.len == 0)
world << "Mutiny mode aborted: no valid candidates for head loyalist."
world << "\red Mutiny mode aborted: no valid candidates for head loyalist."
return 0
var/list/mutineer_candidates = get_head_mutineer_candidates()
if(!mutineer_candidates || mutineer_candidates.len == 0)
world << "Mutiny mode aborted: no valid candidates for head mutineer."
world << "\red Mutiny mode aborted: no valid candidates for head mutineer."
return 0
var/list/directive_candidates = get_directive_candidates()
if(!directive_candidates || directive_candidates.len == 0)
world << "Mutiny mode aborted: no valid candidates for Directive X."
world << "\red Mutiny mode aborted: no valid candidates for Directive X."
return 0
head_loyalist = pick(loyalist_candidates)
@@ -276,12 +254,7 @@ datum/game_mode/mutiny
return 1
/datum/game_mode/mutiny/post_setup()
head_loyalist.current << "You are the Head Loyalist!"
head_loyalist.special_role = "head_loyalist"
equip_head_loyalist()
head_mutineer.current << "You are the Head Mutineer!"
head_mutineer.special_role = "head_mutineer"
equip_head_mutineer()
loyalists+=head_loyalist
@@ -290,26 +263,13 @@ datum/game_mode/mutiny
replace_nuke_with_ead()
current_directive.initialize()
unbolt_vault_door()
make_secret_transcript()
update_all_icons()
spawn(0)
reveal_directives()
..()
/datum/game_mode/mutiny/check_antagonists_topic(href, href_list[])
switch(href_list["choice"])
if("activate_captains_key")
ead.captains_key = 1
return 1
if("activate_secondary_key")
ead.secondary_key = 1
return 1
if("activate_ead")
ead.activated = 1
return 1
else
return 0
/mob/living/carbon/human/proc/recruit_loyalist()
set name = "Recruit Loyalist"
set category = "Mutiny"
@@ -0,0 +1,83 @@
/datum/game_mode/mutiny/proc/check_antagonists_ui(admins)
var/turf/captains_key_loc = captains_key ? captains_key.get_loc_turf() : "Lost or Destroyed"
var/turf/secondary_key_loc = secondary_key ? secondary_key.get_loc_turf() : "Lost or Destroyed"
var/remaining_objectives = current_directive.get_remaining_orders()
var/txt = {"
<h5>Context:</h5>
<p>
[current_directive.get_description()]
</p>
<h5>Orders:</h5>
<ol>
[fluff.get_orders()]
</ol>
<br>
<h5>Remaining Objectives</h5>
<ol>
[remaining_objectives ? remaining_objectives : "<li>None</li>"]
</ol>
<br>
<h5>Authentication:</h5>
<b>Captain's Key:</b> [captains_key_loc]
<a href='?src=\ref[admins];choice=activate_captains_key'>Activate</a><br>
<b>Secondary Key:</b> [secondary_key_loc]
<a href='?src=\ref[admins];choice=activate_secondary_key'>Activate</a><br>
<b>EAD: [ead ? ead.get_status() : "Lost or Destroyed"]</b>
<a href='?src=\ref[admins];choice=activate_ead'>Activate</a><br>
<hr>
"}
txt += "<a href='?src=\ref[admins];choice=reassign_head_loyalist'>Reassign Head Loyalist</a><br>"
if(head_loyalist)
txt += check_role_table("Head Loyalist", list(head_loyalist), admins, 0)
var/list/loyal_crew = loyalists - head_loyalist
if(loyal_crew.len)
txt += check_role_table("Loyalists", loyal_crew, admins, 0)
txt += "<a href='?src=\ref[admins];choice=reassign_head_mutineer'>Reassign Head Mutineer</a><br>"
if(head_mutineer)
txt += check_role_table("Head Mutineer", list(head_mutineer), admins, 0)
var/list/mutiny_crew = mutineers - head_mutineer
if(mutiny_crew.len)
txt += check_role_table("Mutineers", mutiny_crew, admins, 0)
if(body_count.len)
txt += check_role_table("Casualties", body_count, admins, 0)
return txt
/datum/game_mode/mutiny/check_antagonists_topic(href, href_list[])
switch(href_list["choice"])
if("activate_captains_key")
ead.captains_key = 1
return 1
if("activate_secondary_key")
ead.secondary_key = 1
return 1
if("activate_ead")
ead.activated = 1
return 1
if("reassign_head_loyalist")
var/mob/M = get_reassignment_candidate("Loyalist")
if(M)
head_loyalist = M.mind
equip_head_loyalist()
return 1
if("reassign_head_mutineer")
var/mob/M = get_reassignment_candidate("Mutineer")
if(M)
head_mutineer = M.mind
equip_head_mutineer()
return 1
else
return 0
/datum/game_mode/mutiny/proc/get_reassignment_candidate(faction)
var/list/targets[0]
for(var/mob/living/carbon/human/H in player_list)
if(H.is_ready() && !H.is_dead())
targets.Add(H)
return input("Select a player to lead the [faction] faction.", "Head [faction] reassignment", null) as mob in targets
+47 -5
View File
@@ -154,7 +154,7 @@ Both keys are required to activate the <b>Emergency Authentication Device (EAD)<
proc/loyalist_major_victory()
return {"
NanoTrasen has praised the efforts of Captain [mode.head_loyalist] and loyal members of [their(mode.head_loyalist)] crew, who recently managed to put down a mutiny--amid a local interstellar crisis--aboard the <b>[station_name()]</b>, a research station in Tau Ceti.
NanoTrasen has praised the efforts of Captain [mode.head_loyalist] and loyal members of [their(mode.head_loyalist)] crew, who recently managed to put down a mutiny--amid a local interstellar crisis--aboard the <b>[station_name()]</b>, a research station in [system_name()].
The mutiny was spurred by a top secret directive sent to the station, presumably in response to the crisis within the system.
Despite the mutiny, the crew was successful in implementing the directive and activating their on-board emergency authentication device.
[mode.mutineers.len] members of the station's personnel were charged with sedition against the company and if found guilty will be sentenced to life incarceration.
@@ -165,7 +165,7 @@ NanoTrasen will be awarding [mode.loyalists.len] members of the crew with the [l
proc/loyalist_minor_victory()
return {"
NanoTrasen has praised the efforts of Captain [mode.head_loyalist] and loyal members of [their(mode.head_loyalist)] crew, who recently managed to put down a mutiny--amid a local interstellar crisis--aboard the <b>[station_name()]</b>, a research station in Tau Ceti.
NanoTrasen has praised the efforts of Captain [mode.head_loyalist] and loyal members of [their(mode.head_loyalist)] crew, who recently managed to put down a mutiny--amid a local interstellar crisis--aboard the <b>[station_name()]</b>, a research station in [system_name()].
The mutiny was spurred by a top secret directive sent to the station, presumably in response to the crisis within the system.
Despite the mutiny, the crew was successful in implementing the directive. Unfortunately, they failed to notify Central Command of their successes due to a breach in the chain of command.
[mode.mutineers.len] members of the station's personnel were charged with sedition against the Company and if found guilty will be sentenced to life incarceration.
@@ -176,7 +176,7 @@ NanoTrasen will be awarding [mode.loyalists.len] members of the crew with the [l
proc/no_victory()
return {"
NanoTrasen has been thrust into turmoil following an apparent mutiny by key personnel aboard the <b>[station_name()]</b>, a research station in Tau Ceti.
NanoTrasen has been thrust into turmoil following an apparent mutiny by key personnel aboard the <b>[station_name()]</b>, a research station in [system_name()].
The mutiny was spurred by a top secret directive sent to the station, presumably in response to the crisis within the system.
No further information has yet emerged from the station or its crew, who are presumed to be in holding with NanoTrasen investigators.
NanoTrasen officials refuse to comment.
@@ -187,7 +187,7 @@ Sources indicate that [mode.mutineers.len] members of the station's personnel ar
proc/mutineer_minor_victory()
return {"
Reports have emerged that an impromptu mutiny has taken place, amid a local interstellar crisis, aboard the <b>[station_name()]</b>, a research station in Tau Ceti.
Reports have emerged that an impromptu mutiny has taken place, amid a local interstellar crisis, aboard the <b>[station_name()]</b>, a research station in [system_name()].
The mutiny was spurred by a top secret directive sent to the station, presumably in response to the crisis within the system.
Information at present indicates that the top-secret directive--which has since been retracted--was invalid due to a broken authentication code. Members of the crew, including an unidentified Head of Staff, prevented the directive from being accomplished.
[mode.mutineers.len] members of the station's personnel were released from interrogations today, following a mutiny investigation.
@@ -198,7 +198,7 @@ NanoTrasen has reprimanded [mode.loyalists.len] members of the crew for failing
proc/mutineer_major_victory()
return {"
NanoTrasen has praised the efforts of [mode.head_mutineer.assigned_role] [mode.head_mutineer] and several other members of the crew, who recently seized control of a research station in Tau Ceti--<b>[station_name()]</b>--amid a local interstellar crisis.
NanoTrasen has praised the efforts of [mode.head_mutineer.assigned_role] [mode.head_mutineer] and several other members of the crew, who recently seized control of a research station in [system_name()]--<b>[station_name()]</b>--amid a local interstellar crisis.
What appears to have been a "legitimate" mutiny was spurred by a top secret directive sent to the station, presumably in response to the crisis within the system.
It has been revealed that the directive was invalid and fraudulent. Company officials have not released a statement about the source of the directive.
Thanks to the efforts of the resistant members of the crew, the directive was not carried out.
@@ -207,3 +207,45 @@ NanoTrasen has [mode.loyalists.len] members of the crew in holding, while it inv
[mode.body_count.len] are believed to have died during the coup.
<p>Even though the directive was not successfully implemented, NanoTrasen's image will forever be haunted by the fact that its authentication protocol was breached with such magnitude and that a mutiny was the result.</p>
"}
proc/secret_transcript()
return {"
<center><h3>Corporate Rival Threat Assessment</h3></center>
<center><b>Gilthari Exports Incident Transcript</b></center>
<center><font color='red'>CONFIDENTIAL: PROPERTY OF NANOTRASEN</font></center>
<i>Location:</i> Operator's Desk, D Deck, Polumetis Installation<br>
<i>Time:</i> 16:11, May 24, 2558 (Sol Reckoning)<br>
<br>
<br>
<center>\[Start of transcript\]</center>
<center>\[Sound of an internal airlock door opening\]</center>
TM: Thank you for coming to see me, Director. I'm afraid this is urgent.<br>
D: Mr. Mitchell, first you send cryptic messages to my office and then you request to have me come personally to this barely lit closet you call a workstation; all of this to talk about a computer glitch?<br>
<center>\[Sound of the internal airlock door shutting\]</center>
TM: Do you remember <b>Mallory</b>?<br>
D: Who?<br>
TM: It's not who, it's what. The computer program we planted in the [system_name()] communications satellite.<br>
D: What is so important about this computer program?<br>
TM: We call her an eavesdropper. Captures network traffic, records it, and forwards the stream to the receiver autonomously.<br>
D: Speak English <i>goddamnit</i>.<br>
TM: Standard intelligence acquisition package, sir; we bug their satellite and listen. It's like we have their playbook and we know what their moves are going to be on the market before they make them.<br>
D: So Mallory doesn't work?<br>
TM: She worked, sir. We've had an ear on NanoTrasen's regional communications for weeks.<br>
D: Any news about their <b>Plasma refinement process</b>?<br>
TM: No sir. Our analysts believe they are using a separate channel for their most sensitive data.<br>
D: So what's the problem?<br>
TM: The intelligence hasn't been doing us any good. Anything that appears actionable, I send it to the analysts and they make a plan. Thing is, NanoTrasen always sees us coming.<br>
D: Tim...<br>
TM: I think they discovered the hack, sir. Case in point, <b>Energine Consolidated Solutions</b>. That subsidiary of ours that was awarded a lease on NanoTrasen's mining platform in Nyx? NanoTrasen acquired them a week before we made the announcement.<br>
D: They know about they have a bug. <i>They left her on and fed her the information for us to hear</i>, those sneaks. How did they find it?<br>
TM: Top secret communique came through. I'm not sure what happened. Either Mallory couldn't replicate the encryption scheme and garbled it going out or the transmission was already corrupted to begin with.<br>
D: Either way the transmission caused NanoTrasen to look at the satellite. They found out about Mallory.<br>
TM: Precisely sir. There's only so much I can do to cover our tracks from here.<br>
D: I'm pulling the plug. We have assets in the sector that are capable of a job like this. Thank you for bringing this to my attention.<br>
<center>\[Computer device chirps\]</center>
D: One last thing, did you happen to read anything from those secure transmissions?<br>
TM: Just the subject, 'Directive X'.<br>
D: Directive X... Now what do you suppose that means?<br>
<center>\[End of transcript\]</center>
"}
@@ -0,0 +1,66 @@
/obj/item/weapon/pinpointer/advpinpointer/flag
name = "\improper Flag Pinpointer"
desc = "Tracks the position of every nation's flag."
/obj/item/weapon/pinpointer/advpinpointer/flag/attack_self()
switch(mode)
if (0)
mode = 1
active = 1
target = locate(/obj/item/flag/nation/atmos)
workobj()
usr << "\blue You calibrate \the [src] to locate the [target.name]"
if (1)
mode = 2
target = locate(/obj/item/flag/nation/sec)
usr << "\blue You calibrate \the [src] to locate the [target.name]"
if (2)
mode = 3
target = locate(/obj/item/flag/nation/cargo)
usr << "\blue You calibrate \the [src] to locate the [target.name]"
if (3)
mode = 4
target = locate(/obj/item/flag/nation/command)
usr << "\blue You calibrate \the [src] to locate the [target.name]"
if (4)
mode = 5
target = locate(/obj/item/flag/nation/med)
usr << "\blue You calibrate \the [src] to locate the [target.name]"
if (5)
mode = 6
target = locate(/obj/item/flag/nation/rnd)
usr << "\blue You calibrate \the [src] to locate the [target.name]"
else
mode = 0
active = 0
icon_state = "pinoff"
usr << "\blue You switch \the [src] off."
/obj/item/weapon/pinpointer/advpinpointer/flag/examine()
switch(mode)
if (1)
usr << "Is is calibrated for the [target.name]"
if (2)
usr << "Is is calibrated for the [target.name]"
if (3)
usr << "Is is calibrated for the [target.name]"
if (4)
usr << "Is is calibrated for the [target.name]"
if (5)
usr << "Is is calibrated for the [target.name]"
else
usr << "It is switched off."
/datum/supply_packs/key_pinpointer
name = "Nations Flag Pinpointer crate"
contains = list(/obj/item/weapon/pinpointer/advpinpointer/flag)
cost = 20
containertype = /obj/structure/closet/crate
containername = "Nations Flag Pinpointer crate"
access = access_heads
group = "Operations"
New()
// This crate is only accessible during mutiny rounds
if (istype(ticker.mode,/datum/game_mode/nations))
..()
+144
View File
@@ -0,0 +1,144 @@
/obj/item/flag/nation
density = 1
anchored = 1
var/turf/startloc = null
var/captured = 0
var/list/vassals = list()
var/datum/nations/liege = null
var/datum/nations/nation = null
/obj/item/flag/nation/New()
..()
flag_list += src
/obj/item/flag/nation/fire_act()
return
/obj/item/flag/nation/Ignite()
return
/obj/item/flag/nation/light()
return
/obj/item/flag/nation/attackby(var/obj/item/weapon/W, var/mob/user)
return
/obj/item/flag/nation/attack_paw()
return
/obj/item/flag/nation/ex_act()
return
/obj/item/flag/nation/blob_act()
return
/obj/item/flag/nation/attack_hand(mob/user as mob)
if(user.mind)
if(user.mind.nation)
var/obj/item/flag/nation/F = locate(user.mind.nation.flagpath)
if(istype(user.mind.nation,nation)) //Same team as flag
if(liege && liege == F.liege)
user << "<span class='warning'>You can't steal your liege's flags!</span>"
return
else if(loc != startloc)
loc = startloc
user.visible_message("[user] sends [src] back to base!", "You return [src] to your base!")
return
else
user << "<span class='warning'>You can't move your flag from it's home location!</span>"
return
else
if(captured && Adjacent(F.startloc))
user << "<span class='warning'>This flag has already been captured by your team!</span>"
return
else if(..())
captured = 0
anchored = 0
var/obj/item/flag/nation/N = null
if(liege)
N = locate(liege.flagpath)
for(var/mob/living/carbon/human/H in player_list)
if(H.mind && H.mind.nation && liege && nation)
if(H.mind.nation.name == liege.name) //we have to check based on the name var since they will be different instances of the nation datum
H.mind.current << "<span class='warning'>You are no longer the liege of [nation]!</span>"
if(H.mind.nation.name == nation.name)
H.mind.current << "<span class='warning'>You are no longer vassals of [liege]!</span>"
if(N)
N.vassals -= nation
liege = null
else
user << "<span class='warning'>You are not part of a nation and therefore cannot pick up any flags!</span>"
return
return
/obj/item/flag/nation/dropped(mob/user as mob)
..()
spawn(20)
anchored = 1
var/obj/item/flag/nation/F = locate(user.mind.nation.flagpath)
if(F.loc != F.startloc) return
for(var/obj/item/flag/nation/S in orange(1,F.startloc))
if(S == src)
captured = 1
liege = F.nation
F.vassals += nation
//Announce capture/vassalage here.
for(var/mob/living/carbon/human/H in player_list)
if(H.mind && H.mind.nation && F.nation && nation)
if(H.mind.nation.name == F.nation.name)
H.mind.current << "<span class='warning'>You have just vassalized [nation]! They must now obey any members of your nation!</span>"
continue
if(H.mind.nation.name == nation.name)
H.mind.current << "<span class='warning'>You are now vassals of [liege]! You must now obey the orders of any of their members!</span>"
continue
//Check for Victory
for(var/obj/item/flag/nation/N in flag_list)
if(F.nation && N.nation)
if(F.nation.name == N.nation.name)
continue
if(N.liege && F.nation)
if(N.captured && N.liege.name == F.nation.name)
continue
else
return
ticker.mode.declare_completion(F.nation)
//Nations/Department flags --Nations Gamemode Specific
/obj/item/flag/nation/cargo
name = "Cargonia flag"
desc = "The flag of the independent, sovereign nation of Cargonia."
icon_state = "cargoflag"
nation = new /datum/nations/cargonia
/obj/item/flag/nation/med
name = "Medistan flag"
desc = "The flag of the independent, sovereign nation of Medistan."
icon_state = "medflag"
nation = new /datum/nations/medistan
/obj/item/flag/nation/sec
name = "Brigston flag"
desc = "The flag of the independent, sovereign nation of Brigston."
icon_state = "secflag"
nation = new /datum/nations/brigston
/obj/item/flag/nation/rnd
name = "Scientopia flag"
desc = "The flag of the independent, sovereign nation of Scientopia."
icon_state = "rndflag"
nation = new /datum/nations/scientopia
/obj/item/flag/nation/atmos
name = "Atmosia flag"
desc = "The flag of the independent, sovereign nation of Atmosia."
icon_state = "atmosflag"
nation = new /datum/nations/atmosia
/obj/item/flag/nation/command
name = "People's Republic of Commandzakstan flag"
desc = "The flag of the independent, sovereign nation of the People's Republic of Commandzakstan."
icon_state = "ntflag"
nation = new /datum/nations/command
@@ -0,0 +1,30 @@
/datum/nations
var/name
var/flagpath
/datum/nations/atmosia
name = "Atmosia"
flagpath = /obj/item/flag/nation/atmos
/datum/nations/brigston
name = "Brigston"
flagpath = /obj/item/flag/nation/sec
/datum/nations/cargonia
name = "Cargonia"
flagpath = /obj/item/flag/nation/cargo
/datum/nations/command
name = "People's Republic of Commandzakstan"
flagpath = /obj/item/flag/nation/command
/datum/nations/medistan
name = "Medistan"
flagpath = /obj/item/flag/nation/med
/datum/nations/scientopia
name = "Scientopia"
flagpath = /obj/item/flag/nation/rnd
+437
View File
@@ -0,0 +1,437 @@
var/global/no_synthetic = 0
datum/game_mode/nations
name = "nations"
config_tag = "nations"
required_players_secret = 25
var/const/waittime_l = 1200 //lower bound on time before intercept arrives (in tenths of seconds)
var/const/waittime_h = 3000 //upper bound on time before intercept arrives (in tenths of seconds)
var/kickoff = 0
var/victory = 0
var/list/cargonians = list("Quartermaster","Cargo Technician","Shaft Miner")
/datum/game_mode/nations/pre_pre_setup()
no_synthetic = 1
/datum/game_mode/nations/post_setup()
spawn (rand(waittime_l, waittime_h))
remove_flags()
spawn(50)
kickoff=1
send_intercept()
split_teams()
spawn_flags()
populate_vars()
return ..()
/datum/game_mode/nations/send_intercept()
command_alert("Due to recent and COMPLETELY UNFOUNDED allegations of massive fraud and insider trading \
affecting trillions of investors, the Nanotrasen Corporation has decided to liquidate all \
assets of the Centcom Division in order to pay the massive legal fees that will be incurred \
during the following centuries long court process. Therefore, all current employment contracts \
are IMMEDIATELY TERMINATED. Nanotrasen will be unable to send a rescue shuttle to carry you home,\
however they remain willing for the time being to continue trading cargo. Have a pleasant \
day.", "FINAL TRANSMISSION, CENTCOM COMMAND.")
/datum/game_mode/nations/proc/remove_flags()
for(var/obj/item/flag/F in world)
del(F)
/datum/game_mode/nations/proc/spawn_flags()
for(var/obj/effect/landmark/nations/N in landmarks_list)
switch(N.name)
if("Atmosia")
new /obj/item/flag/nation/atmos(get_turf(N))
if("Brigston")
new /obj/item/flag/nation/sec(get_turf(N))
if("Cargonia")
new /obj/item/flag/nation/cargo(get_turf(N))
if("People's Republic of Commandzakstan")
new /obj/item/flag/nation/command(get_turf(N))
if("Medistan")
new /obj/item/flag/nation/med(get_turf(N))
if("Scientopia")
new /obj/item/flag/nation/rnd(get_turf(N))
/datum/game_mode/nations/proc/split_teams()
for(var/mob/living/carbon/human/H in player_list)
if(H.mind)
if(H.mind.assigned_role in engineering_positions)
H.mind.nation = all_nations["Atmosia"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudatmosia")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
continue
else if(H.mind.assigned_role in medical_positions)
H.mind.nation = all_nations["Medistan"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudmedistan")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
continue
else if(H.mind.assigned_role in science_positions)
H.mind.nation = all_nations["Scientopia"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudscientopia")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
continue
else if(H.mind.assigned_role in security_positions)
H.mind.nation = all_nations["Brigston"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudbrigston")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
continue
else if(H.mind.assigned_role in cargonians)
H.mind.nation = all_nations["Cargonia"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcargonia")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
continue
else if(H.mind.assigned_role in civilian_positions)
H.mind.nation = all_nations["People's Republic of Commandzakstan"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcommand")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
continue
else if(H.mind.assigned_role in command_positions)
H.mind.nation = all_nations["People's Republic of Commandzakstan"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcommand")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
continue
else
message_admins("[H.name] with [H.mind.assigned_role] could not find any nation to assign!")
continue
/datum/game_mode/nations/proc/populate_vars()
for(var/obj/effect/landmark/nations/N in landmarks_list)
switch(N.name)
if("Atmosia")
for(var/obj/item/flag/nation/atmos/A in flag_list)
A.startloc = get_turf(N)
continue
if("Brigston")
for(var/obj/item/flag/nation/sec/B in flag_list)
B.startloc = get_turf(N)
continue
if("Cargonia")
for(var/obj/item/flag/nation/cargo/C in flag_list)
C.startloc = get_turf(N)
continue
if("People's Republic of Commandzakstan")
for(var/obj/item/flag/nation/command/D in flag_list)
D.startloc = get_turf(N)
continue
if("Medistan")
for(var/obj/item/flag/nation/med/M in flag_list)
M.startloc = get_turf(N)
continue
if("Scientopia")
for(var/obj/item/flag/nation/rnd/S in flag_list)
S.startloc = get_turf(N)
continue
/datum/game_mode/nations/check_finished()
if(victory)
return 1
return 0
/datum/game_mode/nations/declare_completion(var/datum/nations/N)
world << "[N.name] has captured all of the station. All glory to [N.name]"
victory = 1
/mob/proc/nations_status()
set category = "OOC"
set name = "Nation Status"
set desc = "Information on your nation and your allies."
if (!( ticker )) return
if (ticker.mode.name != "nations") return
if(!mind) return
if(!mind.nation) return
var/obj/item/flag/nation/F = locate(mind.nation.flagpath)
var/dat = "<html><head><title>Nation Status</title></head><body><h1><B>Nation Status</B></h1>"
dat += "You are part of the nation of <B>[mind.nation.name]</B>.<BR>"
dat += "You -cannot- defect to another nation. Doing so or helping<br>"
dat += "another nation you are not a vassal of is bannable.<br>"
dat += "<br><table cellspacing=5><tr><td><B>Liege</B></td><td></td></tr>"
if(F.liege)
dat += "You are currently the vassal of [F.liege.name] and must obey<br>"
dat += "the commands of ANY of their members.<br>"
else
dat += "You are not currently vassalized by anyone! Protect your flag!<br>"
dat += "</table>"
dat += "<br><table cellspacing=5><tr><td><B>Vassals</B></td><td></td></tr>"
if(F.vassals.len)
for(var/datum/nations/V in F.vassals)
dat += "[V.name] is your vassal and must obey the commands of ANY of your members."
else
dat += "You do not currently have any vassals! Capture flags to vassalize!<br>"
dat += "</table>"
dat += "<br><table cellspacing=5><tr><td><B>Geneva Space Convention</B></td><td></td></tr>"
dat += "The following are considered OUTLAWED by the Geneva Space Convention and will result"
dat += "in severe consequences if used in warfare:<br>"
dat += "<B>Scientopia - Large Scale Bombs - Nuclear Warfare"
dat += "Atmosia - Using atmos as a weapon - Chemical Warfare"
dat += "Medistan - Releasing harmful viruses - Biological Warfare</B>"
dat += "</table>"
dat += "</body></html>"
usr << browse(dat, "window=nationstatus;size=400x500")
/mob/proc/respawn_self()
set category = "OOC"
set name = "Respawn Character"
set desc = "Respawn yourself (15 minute cooldown)."
if (!( ticker ))
usr << "\blue <B>The round hasn't started!</B>"
return
if(stat!=2)
usr << "\blue You must be dead to respawn."
return
if (ticker.mode.name != "nations")
usr << "\blue Respawn is disabled."
return
if(!mind)
return
if(!mind.nation)
src << "It appears you're not part of a nation. Use Respawn as NPC instead."
return
if(!mind.assigned_role)
src << "It appears you're not part of a nation. Use Respawn as NPC instead."
return
if(!mind.assigned_role in get_all_jobs())
src << "It appears you're not part of a nation. Use Respawn as NPC instead."
return
if(mind.special_role)
src << "It appears you beame an antag and are longer part of a nation. Use Respawn as NPC instead."
return
else
var/deathtime = world.time - src.timeofdeath
var/deathtimeminutes = round(deathtime / 600)
var/pluralcheck = "minute"
if(deathtimeminutes == 0)
pluralcheck = ""
else if(deathtimeminutes == 1)
pluralcheck = " [deathtimeminutes] minute and"
else if(deathtimeminutes > 1)
pluralcheck = " [deathtimeminutes] minutes and"
var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1)
usr << "You have been dead for[pluralcheck] [deathtimeseconds] seconds."
if (deathtime < 9000)
usr << "You must wait 15 minutes to respawn!"
return
else
//Ok, it's not a xeno or a monkey. So, spawn a human.
var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned.
var/datum/data/record/record_found //Referenced to later to either randomize or not randomize the character.
if(mind) //mind isn't currently in use by someone/something
/*Try and locate a record for the person being respawned through data_core.
This isn't an exact science but it does the trick more often than not.*/
var/id = md5("[real_name][mind.assigned_role]")
for(var/datum/data/record/t in data_core.locked)
if(t.fields["id"]==id)
record_found = t//We shall now reference the record.
break
if(record_found)//If they have a record we can determine a few things.
new_character.real_name = record_found.fields["name"]
new_character.gender = record_found.fields["sex"]
new_character.age = record_found.fields["age"]
new_character.b_type = record_found.fields["b_type"]
else
new_character.gender = pick(MALE,FEMALE)
var/datum/preferences/A = new()
A.randomize_appearance_for(new_character)
new_character.real_name = real_name
if(!new_character.real_name)
if(new_character.gender == MALE)
new_character.real_name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
else
new_character.real_name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
new_character.name = new_character.real_name
if(mind)
mind.transfer_to(new_character) //be careful when doing stuff like this! I've already checked the mind isn't in use
new_character.mind.special_verbs = list()
else
new_character.mind_initialize()
if(!new_character.mind.assigned_role) new_character.mind.assigned_role = "Assistant"//If they somehow got a null assigned role.
//DNA
if(record_found)//Pull up their name from database records if they did have a mind.
new_character.dna = new()//Let's first give them a new DNA.
new_character.dna.unique_enzymes = record_found.fields["b_dna"]//Enzymes are based on real name but we'll use the record for conformity.
// I HATE BYOND. HATE. HATE. - N3X
var/list/newSE= record_found.fields["enzymes"]
var/list/newUI = record_found.fields["identity"]
new_character.dna.SE = newSE.Copy() //This is the default of enzymes so I think it's safe to go with.
new_character.dna.UpdateSE()
new_character.UpdateAppearance(newUI.Copy())//Now we configure their appearance based on their unique identity, same as with a DNA machine or somesuch.
else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile.
new_character.dna.ready_dna(new_character)
new_character.key = key
job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)//Or we simply equip them.
if(!record_found)//If there are no records for them. If they have a record, this info is already in there. MODE people are not announced anyway.
data_core.manifest_inject(new_character)
new_character << "You have been fully respawned. Get back in the fight!."
new_character.hud_updateflag |= 1 << NATIONS_HUD
return new_character
/**
* LateSpawn hook.
* Called in newplayer.dm when a humanoid character joins the round after it started.
* Parameters: var/mob/living/carbon/human, var/rank
*/
/hook/latespawn/proc/give_latejoiners_nations(var/mob/living/carbon/human/H)
var/datum/game_mode/nations/mode = get_nations_mode()
if (!mode) return 1
if(!mode.kickoff) return 1
var/list/cargonians = list("Quartermaster","Cargo Technician","Shaft Miner")
if(H.mind)
if(H.mind.assigned_role in engineering_positions)
H.mind.nation = all_nations["Atmosia"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudatmosia")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
return 1
else if(H.mind.assigned_role in medical_positions)
H.mind.nation = all_nations["Medistan"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudmedistan")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
return 1
else if(H.mind.assigned_role in science_positions)
H.mind.nation = all_nations["Scientopia"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudscientopia")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
return 1
else if(H.mind.assigned_role in security_positions)
H.mind.nation = all_nations["Brigston"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudbrigston")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
return 1
else if(H.mind.assigned_role in cargonians)
H.mind.nation = all_nations["Cargonia"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcargonia")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
return 1
else if(H.mind.assigned_role in civilian_positions)
H.mind.nation = all_nations["People's Republic of Commandzakstan"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcommand")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
return 1
else if(H.mind.assigned_role in command_positions)
H.mind.nation = all_nations["People's Republic of Commandzakstan"]
H.hud_updateflag |= 1 << NATIONS_HUD
var/I = image('icons/mob/hud.dmi', loc = H.mind.current, icon_state = "hudcommand")
H.client.images += I
H.verbs += /mob/proc/respawn_self
H.verbs += /mob/proc/nations_status
H.verbs -= /mob/living/verb/ghost
H.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer/flag(H), slot_r_hand)
H << "You are now part of the great sovereign nation of [H.mind.nation.name]!"
return 1
else
message_admins("[H.name] with [H.mind.assigned_role] could not find any nation to assign!")
return 1
message_admins("[H.name] latejoined with no mind.")
return 1
/proc/get_nations_mode()
if(!ticker || !istype(ticker.mode, /datum/game_mode/nations))
return null
return ticker.mode
+27 -21
View File
@@ -194,10 +194,6 @@ proc/issyndicate(mob/living/M as mob)
for(var/datum/objective/objective in syndicate.objectives)
syndicate.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++
for(var/obj/item/weapon/implant/explosive/E in syndicate.current.contents)
if (E.implanted)
syndicate.current << "The activation code for your explosive implant is <B>[E.phrase]</B>"
syndicate.store_memory("The activation code for your explosive implant is <B>[E.phrase]</B>")
return
@@ -226,27 +222,26 @@ proc/issyndicate(mob/living/M as mob)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(synd_mob), slot_belt)
synd_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(synd_mob.back), slot_in_backpack)
var/obj/item/clothing/suit/space/rig/syndi/new_suit = new(synd_mob)
var/obj/item/clothing/head/helmet/space/rig/syndi/new_helmet = new(synd_mob)
if(synd_mob.species)
var/race = synd_mob.species.name
if(race == "Unathi")
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi/unathi(synd_mob), slot_wear_suit)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi/unathi(synd_mob), slot_head)
else if(race == "Tajaran")
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi/tajara(synd_mob), slot_wear_suit)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi/tajara(synd_mob), slot_head)
else if(race == "Skrell")
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi/skrell(synd_mob), slot_wear_suit)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi/skrell(synd_mob), slot_head)
else
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi/human(synd_mob), slot_wear_suit)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi/human(synd_mob), slot_head)
else
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi/human(synd_mob), slot_wear_suit)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi/human(synd_mob), slot_head)
switch(race)
if("Unathi")
new_suit.species_restricted = list("Unathi")
if("Tajaran")
new_suit.species_restricted = list("Tajaran")
if("Skrell")
new_suit.species_restricted = list("Skrell")
synd_mob.equip_to_slot_or_del(new_suit, slot_wear_suit)
synd_mob.equip_to_slot_or_del(new_helmet, slot_head)
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(synd_mob)
var/obj/item/weapon/implant/dexplosive/E = new/obj/item/weapon/implant/dexplosive(synd_mob)
E.imp_in = synd_mob
E.implanted = 1
synd_mob.update_icons()
@@ -337,6 +332,9 @@ proc/issyndicate(mob/living/M as mob)
if( syndicates.len || (ticker && istype(ticker.mode,/datum/game_mode/nuclear)) )
var/text = "<FONT size = 2><B>The syndicate operatives were:</B></FONT>"
var/purchases = ""
var/TC_uses = 0
for(var/datum/mind/syndicate in syndicates)
text += "<br>[syndicate.key] was [syndicate.name] ("
@@ -351,6 +349,14 @@ proc/issyndicate(mob/living/M as mob)
text += "body destroyed"
text += ")"
for(var/obj/item/device/uplink/H in world_uplinks)
if(H && H.uplink_owner && H.uplink_owner==syndicate.name)
TC_uses += H.used_TC
purchases += H.purchase_log
text += "(Syndicates used [TC_uses] TC) [purchases]"
world << text
return 1
@@ -377,4 +383,4 @@ proc/issyndicate(mob/living/M as mob)
if(FEMALE)
synd_mind.name = "[pick(first_names_female)] [pick(last_names)]"
synd_mind.current.real_name = synd_mind.name
return
return
+18 -1
View File
@@ -236,6 +236,19 @@
text += "body destroyed"
text += ")"
var/TC_uses = 0
var/uplink_true = 0
var/purchases = ""
for(var/obj/item/device/uplink/H in world_uplinks)
if(H && H.uplink_owner && H.uplink_owner==traitor.name)
TC_uses += H.used_TC
uplink_true=1
purchases += H.purchase_log
if(uplink_true) text += " (used [TC_uses] TC) [purchases]"
if(traitor.objectives.len)//If the traitor had no objectives, don't need to process this.
var/count = 1
for(var/datum/objective/objective in traitor.objectives)
@@ -254,6 +267,7 @@
else
special_role_text = "antagonist"
if(traitorwin)
text += "<br><font color='green'><B>The [special_role_text] was successful!</B></font>"
feedback_add_details("traitor_success","SUCCESS")
@@ -261,6 +275,7 @@
text += "<br><font color='red'><B>The [special_role_text] has failed!</B></font>"
feedback_add_details("traitor_success","FAIL")
world << text
return 1
@@ -299,6 +314,7 @@
var/obj/item/device/uplink/hidden/T = new(R)
target_radio.hidden_uplink = T
T.uplink_owner = "[traitor_mob]"
target_radio.traitor_frequency = freq
traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features."
traitor_mob.mind.store_memory("<B>Radio Freq:</B> [format_frequency(freq)] ([R.name] [loc]).")
@@ -308,6 +324,7 @@
var/obj/item/device/uplink/hidden/T = new(R)
R.hidden_uplink = T
T.uplink_owner = "[traitor_mob]"
var/obj/item/device/pda/P = R
P.lock_code = pda_pass
@@ -393,4 +410,4 @@
traitor_mind.special_role = null
update_traitor_icons_removed(traitor_mind)
//world << "Removed [traitor_mind.current.name] from traitor shit"
traitor_mind.current << "\red <FONT size = 3><B>The fog clouding your mind clears. You remember nothing from the moment you were implanted until now.(You don't remember who implanted you)</B></FONT>"
traitor_mind.current << "\red <FONT size = 3><B>The fog clouding your mind clears. You remember nothing from the moment you were implanted until now.(You don't remember who implanted you)</B></FONT>"
+7 -7
View File
@@ -129,15 +129,15 @@
/datum/game_mode/proc/auto_declare_completion_enthralled()
if(enthralled.len)
var/text = "<FONT size = 2><B>The Enthralled were:</B></FONT>"
for(var/datum/mind/enthralled in enthralled)
text += "<br>[enthralled.key] was [enthralled.name] ("
if(enthralled.current)
if(enthralled.current.stat == DEAD)
for(var/datum/mind/Mind in enthralled)
text += "<br>[Mind.key] was [Mind.name] ("
if(Mind.current)
if(Mind.current.stat == DEAD)
text += "died"
else
text += "survived"
if(enthralled.current.real_name != enthralled.name)
text += " as [enthralled.current.real_name]"
if(Mind.current.real_name != Mind.name)
text += " as [Mind.current.real_name]"
else
text += "body destroyed"
text += ")"
@@ -282,7 +282,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
blood = min(10, H.vessel.get_reagent_amount("blood"))// if they have less than 10 blood, give them the remnant else they get 10 blood
src.mind.vampire.bloodtotal += blood
src.mind.vampire.bloodusable += blood
H.adjustCloneLoss(5) // beep boop 10 damage
H.adjustCloneLoss(10) // beep boop 10 damage
else
blood = min(5, H.vessel.get_reagent_amount("blood"))// The dead only give 5 bloods
src.mind.vampire.bloodtotal += blood
+15 -6
View File
@@ -48,7 +48,7 @@
/mob/proc/vampire_can_reach(mob/M as mob, active_range = 1)
if(M.loc == src.loc) return 1 //target and source are in the same thing
if(!isturf(src.loc) || !isturf(M.loc)) return 0 //One is inside, the other is outside something.
if(AStar(src.loc, M.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, active_range)) //If a path exists, good!
if(Adjacent(M))//if(AStar(src.loc, M.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, active_range)) //If a path exists, good!
return 1
return 0
@@ -58,7 +58,7 @@
var/datum/vampire/vampire = mind.vampire
if(!vampire) return
var/list/victims = list()
for(var/mob/living/carbon/C in oview(active_range))
for(var/mob/living/carbon/C in view(active_range))
victims += C
var/mob/living/carbon/T = input(src, "Victim?") as null|anything in victims
@@ -180,7 +180,7 @@
if(istype(M.current:glasses, /obj/item/clothing/glasses/sunglasses/blindfold))
M.current << "<span class='warning'>You're blindfolded!</span>"
return
for(var/mob/living/carbon/C in oview(1))
for(var/mob/living/carbon/C in view(1))
if(!C.vampire_affected(M)) continue
if(!M.current.vampire_can_reach(C, 1)) continue
C.Stun(8)
@@ -211,7 +211,7 @@
if(!M) return
if(M.current.vampire_power(30, 0))
M.current.visible_message("\red [M.current.name] lets out an ear piercing shriek!", "\red You let out a loud shriek.", "\red You hear a loud painful shriek!")
for(var/mob/living/carbon/C in ohearers(4, M.current))
for(var/mob/living/carbon/C in hearers(4, M.current))
if(C == M.current) continue
if(ishuman(C) && (C:l_ear || C:r_ear) && istype((C:l_ear || C:r_ear), /obj/item/clothing/ears/earmuffs)) continue
if(!C.vampire_affected(M)) continue
@@ -221,7 +221,7 @@
C.stuttering = 20
C.Stun(8)
C.Jitter(150)
for(var/obj/structure/window/W in oview(3))
for(var/obj/structure/window/W in view(4))
W.destroy()
playsound(M.current.loc, 'sound/effects/creepyshriek.ogg', 100, 1)
M.current.remove_vampire_blood(30)
@@ -283,13 +283,22 @@
alpha = round((255 * 0.80))
/mob/proc/can_enthrall(mob/living/carbon/C)
var/enthrall_safe = 0
for(var/obj/item/weapon/implant/loyalty/L in C)
if(L && L.implanted)
enthrall_safe = 1
break
for(var/obj/item/weapon/implant/traitor/T in C)
if(T && T.implanted)
enthrall_safe = 1
break
if(!C)
world.log << "something bad happened on enthralling a mob src is [src] [src.key] \ref[src]"
return 0
if(!C.mind)
src << "\red [C.name]'s mind is not there for you to enthrall."
return 0
if((/obj/item/weapon/implant/traitor in C.contents) || (/obj/item/weapon/implant/loyalty in C.contents )||( C.mind in ticker.mode.vampires )||( C.mind.vampire )||( C.mind in ticker.mode.enthralled ))
if(enthrall_safe || ( C.mind in ticker.mode.vampires )||( C.mind.vampire )||( C.mind in ticker.mode.enthralled ))
C.visible_message("\red [C] seems to resist the takeover!", "\blue You feel a familiar sensation in your skull that quickly dissipates.")
return 0
if(!C.vampire_affected(mind))
+27 -11
View File
@@ -14,16 +14,28 @@ var/global/datum/controller/occupations/job_master
proc/SetupOccupations(var/faction = "Station")
occupations = list()
var/list/all_jobs = typesof(/datum/job)
if(!all_jobs.len)
world << "\red \b Error setting up jobs, no job datums found"
return 0
for(var/J in all_jobs)
var/datum/job/job = new J()
if(!job) continue
if(job.faction != faction) continue
occupations += job
if(no_synthetic)
occupations = list()
var/list/all_jobs = typesof(/datum/job) -list(/datum/job/ai,/datum/job/cyborg)
if(!all_jobs.len)
world << "\red \b Error setting up jobs, no job datums found"
return 0
for(var/J in all_jobs)
var/datum/job/job = new J()
if(!job) continue
if(job.faction != faction) continue
occupations += job
else
occupations = list()
var/list/all_jobs = typesof(/datum/job)
if(!all_jobs.len)
world << "\red \b Error setting up jobs, no job datums found"
return 0
for(var/J in all_jobs)
var/datum/job/job = new J()
if(!job) continue
if(job.faction != faction) continue
occupations += job
return 1
@@ -249,7 +261,7 @@ var/global/datum/controller/occupations/job_master
for(var/mob/new_player/player in player_list)
if(player.ready && player.mind && !player.mind.assigned_role)
unassigned += player
if(player.client.prefs.randomslot) player.client.prefs.random_character()
if(player.client.prefs.randomslot) player.client.prefs.random_character(player.client)
Debug("DO, Len: [unassigned.len]")
if(unassigned.len == 0) return 0
@@ -385,6 +397,10 @@ var/global/datum/controller/occupations/job_master
S = locate("start*[rank]") // use old stype
if(istype(S, /obj/effect/landmark/start) && istype(S.loc, /turf))
H.loc = S.loc
// Moving wheelchair if they have one
if(H.buckled && istype(H.buckled, /obj/structure/stool/bed/chair/wheelchair))
H.buckled.loc = H.loc
H.buckled.dir = H.dir
var/datum/money_account/M = create_account(H.real_name, rand(50,500)*10, null)
if(H.mind)
+8 -3
View File
@@ -64,7 +64,8 @@ var/list/command_positions = list(
"Head of Security",
"Chief Engineer",
"Research Director",
"Chief Medical Officer"
"Chief Medical Officer",
"Nanotrasen Representative"
)
@@ -72,6 +73,7 @@ var/list/engineering_positions = list(
"Chief Engineer",
"Station Engineer",
"Life Support Specialist",
"Mechanic"
)
@@ -105,11 +107,12 @@ var/list/civilian_positions = list(
"Quartermaster",
"Cargo Technician",
"Shaft Miner",
"Lawyer",
"Internal Affairs Agent",
"Chaplain",
"Assistant",
"Clown",
"Mime"
"Mime",
"Barber"
)
@@ -119,6 +122,8 @@ var/list/security_positions = list(
"Warden",
"Detective",
"Security Officer",
"Customs Officer",
"Blueshield"
)
+65 -5
View File
@@ -166,11 +166,6 @@
return
return
allow_drop()
return 0
process()
if(filtering > 0)
if(beaker)
@@ -381,6 +376,71 @@
add_fingerprint(usr)
return
/obj/machinery/sleeper/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
if(O.loc == user) //no you can't pull things out of your ass
return
if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.resting) //are you cuffed, dying, lying, stunned or other
return
if(O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src)) // is the mob anchored, too far away from you, or are you too far away from the source
return
if(!ismob(O)) //humans only
return
if(istype(O, /mob/living/simple_animal) || istype(O, /mob/living/silicon)) //animals and robutts dont fit
return
if(!ishuman(user) && !isrobot(user)) //No ghosts or mice putting people into the sleeper
return
if(user.loc==null) // just in case someone manages to get a closet into the blue light dimension, as unlikely as that seems
return
if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc?
return
if(occupant)
user << "\blue <B>The sleeper is already occupied!</B>"
return
if(isrobot(user))
if(!istype(user:module, /obj/item/weapon/robot_module/medical))
user << "<span class='warning'>You do not have the means to do this!</span>"
return
var/mob/living/L = O
if(!istype(L) || L.buckled)
return
if(L.abiotic())
user << "\blue <B>Subject cannot have abiotic items on.</B>"
return
for(var/mob/living/carbon/slime/M in range(1,L))
if(M.Victim == L)
usr << "[L.name] will not fit into the sleeper because they have a slime latched onto their head."
return
if(L == user)
visible_message("[user] starts climbing into the sleeper.", 3)
else
visible_message("[user] starts putting [L.name] into the sleeper.", 3)
if(do_after(user, 20))
if(src.occupant)
user << "\blue <B>The sleeper is already occupied!</B>"
return
if(!L) return
if(L.client)
L.client.perspective = EYE_PERSPECTIVE
L.client.eye = src
L.loc = src
src.occupant = L
src.icon_state = "sleeper_1"
if(orient == "RIGHT")
icon_state = "sleeper_1-r"
L << "\blue <b>You feel cool air surround you. You go numb as your senses turn inward.</b>"
for(var/obj/OO in src)
OO.loc = src.loc
src.add_fingerprint(user)
if(user.pulling == L)
user.pulling = null
return
return
/obj/machinery/sleeper/allow_drop()
return 0
/obj/machinery/sleeper/verb/move_inside()
set name = "Enter Sleeper"
set category = "Object"
+7 -1
View File
@@ -284,10 +284,16 @@ update_flag
ui.set_auto_update(1)
/obj/machinery/portable_atmospherics/canister/Topic(href, href_list)
//Do not use "if(..()) return" here, canisters will stop working in unpowered areas like space or on the derelict.
//Do not use "if(..()) return" here, canisters will stop working in unpowered areas like space or on the derelict. // yeah but without SOME sort of Topic check any dick can mess with them via exploits as he pleases -walter0o
if (!istype(src.loc, /turf))
return 0
if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) // exploit protection -walter0o
usr << browse(null, "window=canister")
onclose(usr, "canister")
return
if(href_list["toggle"])
if (valve_open)
if (holding)
+2 -4
View File
@@ -271,9 +271,7 @@ Auto Patrol: []"},
walk_to(src,0)
if (target) // make sure target exists
if(!istype(target.loc, /turf))
return
if (get_dist(src, src.target) <= 1) // if right next to perp
if (Adjacent(target)) // if right next to perp
playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
src.icon_state = "[lasercolor]ed209-c"
spawn(2)
@@ -738,7 +736,7 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/Bump(M as mob|obj) //Leave no door unopened!
if ((istype(M, /obj/machinery/door)) && (!isnull(src.botcard)))
var/obj/machinery/door/D = M
if (!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard))
if (!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard) && !istype(D,/obj/machinery/door/poddoor))
D.open()
src.frustration = 0
else if ((istype(M, /mob/living/)) && (!src.anchored))
+8 -2
View File
@@ -542,10 +542,9 @@
var/obj/item/weapon/farmbot_arm_assembly/A = new /obj/item/weapon/farmbot_arm_assembly
A.loc = src.loc
A.layer = 20
user << "You add the robot arm to the [src]"
src.loc = A //Place the water tank into the assembly, it will be needed for the finished bot
user.u_equip(S)
del(S)
/obj/item/weapon/farmbot_arm_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -554,18 +553,21 @@
src.build_step++
user << "You add the plant analyzer to [src]!"
src.name = "farmbot assembly"
user.u_equip(W)
del(W)
else if(( istype(W, /obj/item/weapon/reagent_containers/glass/bucket)) && (src.build_step == 1))
src.build_step++
user << "You add a bucket to [src]!"
src.name = "farmbot assembly with bucket"
user.u_equip(W)
del(W)
else if(( istype(W, /obj/item/weapon/minihoe)) && (src.build_step == 2))
src.build_step++
user << "You add a minihoe to [src]!"
src.name = "farmbot assembly with bucket and minihoe"
user.u_equip(W)
del(W)
else if((isprox(W)) && (src.build_step == 3))
@@ -577,6 +579,7 @@
S.tank = wTank
S.loc = get_turf(src)
S.name = src.created_name
user.u_equip(W)
del(W)
del(src)
@@ -589,3 +592,6 @@
return
src.created_name = t
/obj/item/weapon/farmbot_arm_assembly/attack_hand(mob/user as mob)
return //it's a converted watertank, no you cannot pick it up and put it in your backpack
+3 -2
View File
@@ -285,7 +285,8 @@
if(!src.path)
src.path = new()
if(src.patient && (get_dist(src,src.patient) <= 1))
if(src.patient && Adjacent(patient))
if(!src.currently_healing)
src.currently_healing = 1
src.frustration = 0
@@ -483,7 +484,7 @@
/obj/machinery/bot/medbot/Bump(M as mob|obj) //Leave no door unopened!
if ((istype(M, /obj/machinery/door)) && (!isnull(src.botcard)))
var/obj/machinery/door/D = M
if (!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard))
if (!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard) && !istype(D,/obj/machinery/door/poddoor))
D.open()
src.frustration = 0
else if ((istype(M, /mob/living/)) && (!src.anchored))
+2 -6
View File
@@ -219,9 +219,7 @@ Auto Patrol: []"},
walk_to(src,0)
if(target) // make sure target exists
if(!istype(target.loc, /turf))
return
if(get_dist(src, src.target) <= 1) // if right next to perp
if(Adjacent(target)) // if right next to perp
if(istype(src.target,/mob/living/carbon))
playsound(src.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
src.icon_state = "secbot-c"
@@ -605,8 +603,6 @@ Auto Patrol: []"},
if(istype(C, /mob/living/carbon/human))
src.threatlevel = src.assess_perp(C)
else if((src.idcheck) && (istype(C, /mob/living/carbon/monkey)))
src.threatlevel = 4
else if(istype(M, /mob/living/simple_animal/hostile))
if(M.stat == DEAD)
@@ -689,7 +685,7 @@ Auto Patrol: []"},
/obj/machinery/bot/secbot/Bump(M as mob|obj) //Leave no door unopened!
if((istype(M, /obj/machinery/door)) && (!isnull(src.botcard)))
var/obj/machinery/door/D = M
if(!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard))
if(!istype(D, /obj/machinery/door/firedoor) && D.check_access(src.botcard) && !istype(D,/obj/machinery/door/poddoor))
D.open()
src.frustration = 0
else if((istype(M, /mob/living/)) && (!src.anchored))
+5 -2
View File
@@ -215,8 +215,11 @@
if(R.dna.species == "Human") //no more xenos losing ears/tentacles
H.h_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
//for(var/datum/language/L in languages)
// H.add_language(L.name)
H.set_species(R.dna.species)
for(var/datum/language/L in R.languages)
H.add_language(L.name)
H.suiciding = 0
src.attempting = 0
return 1
+3 -32
View File
@@ -2,6 +2,7 @@
name = "AI System Integrity Restorer"
icon = 'icons/obj/computer.dmi'
icon_state = "ai-fixer"
circuit = /obj/item/weapon/circuitboard/aifixer
req_access = list(access_captain, access_robotics, access_heads)
var/mob/living/silicon/ai/occupant = null
var/active = 0
@@ -11,43 +12,13 @@
/obj/machinery/computer/aifixer/attackby(I as obj, user as mob)
/*
if(istype(I, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20))
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
new /obj/item/weapon/shard( src.loc )
var/obj/item/weapon/circuitboard/robotics/M = new /obj/item/weapon/circuitboard/robotics( A )
for (var/obj/C in src)
C.loc = src.loc
M.id = src.id
A.circuit = M
A.state = 3
A.icon_state = "3"
A.anchored = 1
del(src)
else
user << "\blue You disconnect the monitor."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/robotics/M = new /obj/item/weapon/circuitboard/robotics( A )
for (var/obj/C in src)
C.loc = src.loc
M.id = src.id
A.circuit = M
A.state = 4
A.icon_state = "4"
A.anchored = 1
del(src)
*/
if(istype(I, /obj/item/device/aicard))
if(stat & (NOPOWER|BROKEN))
user << "This terminal isn't functioning right now, get it working!"
return
I:transfer_ai("AIFIXER","AICARD",src,user)
//src.attack_hand(user)
..()
return
/obj/machinery/computer/aifixer/attack_ai(var/mob/user as mob)
+2 -20
View File
@@ -266,27 +266,9 @@
src.updateUsrDialog()
else if(istype(I, /obj/item/weapon/screwdriver))
playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20))
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/arcade/M = new /obj/item/weapon/circuitboard/arcade( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.anchored = 1
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
getFromPool(/obj/item/weapon/shard, loc)
A.state = 3
A.icon_state = "3"
else
user << "\blue You disconnect the monitor."
A.state = 4
A.icon_state = "4"
else
..()
@@ -205,6 +205,12 @@
name = "Circuit board (Mining Shuttle)"
build_path = "/obj/machinery/computer/mining_shuttle"
origin_tech = "programming=2"
/obj/item/weapon/circuitboard/engineering_shuttle
name = "Circuit board (Engineering Shuttle)"
build_path = "/obj/machinery/computer/engineering_shuttle"
origin_tech = "programming=2"
/obj/item/weapon/circuitboard/research_shuttle
name = "Circuit board (Research Shuttle)"
build_path = "/obj/machinery/computer/research_shuttle"
@@ -293,14 +299,15 @@
/obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I,/obj/item/weapon/screwdriver))
user.visible_message("\blue \the [user] adjusts the jumper on the [src]'s access protocol pins.", "\blue You adjust the jumper on the access protocol pins.")
if(src.build_path == "/obj/machinery/computer/rdconsole/core")
src.name = "Circuit Board (RD Console - Robotics)"
src.build_path = "/obj/machinery/computer/rdconsole/robotics"
user << "\blue Access protocols succesfully updated."
user << "\blue Access protocols set to robotics."
else
src.name = "Circuit Board (RD Console)"
src.build_path = "/obj/machinery/computer/rdconsole/core"
user << "\blue Defaulting access protocols."
user << "\blue Access protocols set to default."
return
/obj/structure/computerframe/attackby(obj/item/P as obj, mob/user as mob)
+1
View File
@@ -82,6 +82,7 @@
data["science_jobs"] = format_jobs(science_positions)
data["security_jobs"] = format_jobs(security_positions)
data["civilian_jobs"] = format_jobs(civilian_positions)
data["special_jobs"] = format_jobs(whitelisted_positions)
data["centcom_jobs"] = format_jobs(get_all_centcom_jobs())
if (modify && is_centcom())
+1
View File
@@ -368,6 +368,7 @@
R.id= copytext(md5(subject.real_name), 2, 6)
R.name=R.dna.real_name
R.types=DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE
R.languages=subject.languages
//Add an implant if needed
var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
+44 -43
View File
@@ -16,14 +16,14 @@
/obj/machinery/computer/crew/attack_ai(mob/user)
attack_hand(user)
interact(user)
ui_interact(user)
/obj/machinery/computer/crew/attack_hand(mob/user)
add_fingerprint(user)
if(stat & (BROKEN|NOPOWER))
return
interact(user)
ui_interact(user)
/obj/machinery/computer/crew/update_icon()
@@ -43,67 +43,68 @@
if(..()) return
if (src.z > 6)
usr << "\red <b>Unable to establish a connection</b>: \black You're too far away from the station!"
return
return 0
if( href_list["close"] )
usr << browse(null, "window=crewcomp")
var/mob/user = usr
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main")
usr.unset_machine()
return
ui.close()
return 0
if(href_list["update"])
src.updateDialog()
return
return 1
/obj/machinery/computer/crew/interact(mob/user)
ui_interact(user)
/obj/machinery/computer/crew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
if(stat & (BROKEN|NOPOWER))
return
if(!istype(user, /mob/living/silicon) && get_dist(src, user) > 1)
user.unset_machine()
user << browse(null, "window=powcomp")
return
user.set_machine(src)
src.scan()
var/t = "<TT><B>Crew Monitoring</B><HR>"
t += "<BR><A href='?src=\ref[src];update=1'>Refresh</A> "
t += "<A href='?src=\ref[src];close=1'>Close</A><BR>"
t += "<table><tr><td width='40%'>Name</td><td width='20%'>Vitals</td><td width='40%'>Position</td></tr>"
var/list/logs = list()
var/data[0]
var/list/crewmembers = list()
for(var/obj/item/clothing/under/C in src.tracked)
var/log = ""
var/turf/pos = get_turf(C)
if((C) && (C.has_sensor) && (pos) && (pos.z == src.z) && C.sensor_mode)
if(istype(C.loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = C.loc
var/dam1 = round(H.getOxyLoss(),1)
var/dam2 = round(H.getToxLoss(),1)
var/dam3 = round(H.getFireLoss(),1)
var/dam4 = round(H.getBruteLoss(),1)
var/list/crewmemberData = list()
var/life_status = "[H.stat > 1 ? "<font color=red>Deceased</font>" : "Living"]"
var/damage_report = "(<font color='blue'>[dam1]</font>/<font color='green'>[dam2]</font>/<font color='orange'>[dam3]</font>/<font color='red'>[dam4]</font>)"
crewmemberData["sensor_type"] = C.sensor_mode
crewmemberData["dead"] = H.stat > 1
crewmemberData["oxy"] = round(H.getOxyLoss(), 1)
crewmemberData["tox"] = round(H.getToxLoss(), 1)
crewmemberData["fire"] = round(H.getFireLoss(), 1)
crewmemberData["brute"] = round(H.getBruteLoss(), 1)
crewmemberData["name"] = (H.wear_id ? H.wear_id.name : "Unknown")
crewmemberData["area"] = get_area(H)
crewmemberData["x"] = pos.x
crewmemberData["y"] = pos.y
if(H.wear_id)
log += "<tr><td width='40%'>[H.wear_id.name]</td>"
else
log += "<tr><td width='40%'>Unknown</td>"
// Works around list += list2 merging lists; it's not pretty but it works
crewmembers += "temporary item"
crewmembers[crewmembers.len] = crewmemberData
switch(C.sensor_mode)
if(1)
log += "<td width='15%'>[life_status]</td><td width='40%'>Not Available</td></tr>"
if(2)
log += "<td width='20%'>[life_status] [damage_report]</td><td width='40%'>Not Available</td></tr>"
if(3)
var/area/player_area = get_area(H)
log += "<td width='20%'>[life_status] [damage_report]</td><td width='40%'>[player_area.name] ([pos.x], [pos.y])</td></tr>"
logs += log
logs = sortList(logs)
for(var/log in logs)
t += log
t += "</table>"
t += "</FONT></PRE></TT>"
user << browse(t, "window=crewcomp;size=900x600")
onclose(user, "crewcomp")
crewmembers = sortByKey(crewmembers, "name")
data["crewmembers"] = crewmembers
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
if(!ui)
ui = new(user, src, ui_key, "crew_monitor.tmpl", "Crew Monitoring Computer", 900, 600)
ui.set_initial_data(data)
ui.open()
// should make the UI auto-update; doesn't seem to?
ui.set_auto_update(1)
/obj/machinery/computer/crew/proc/scan()
+3 -1
View File
@@ -4,6 +4,7 @@
name = "Pod Launch Control"
desc = "A controll for launching pods. Some people prefer firing Mechas."
icon_state = "computer_generic"
circuit = /obj/item/weapon/circuitboard/pod
var/id = 1.0
var/obj/machinery/mass_driver/connected = null
var/timing = 0.0
@@ -48,7 +49,7 @@
return
return
/*
/obj/machinery/computer/pod/attackby(I as obj, user as mob)
if(istype(I, /obj/item/weapon/screwdriver))
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
@@ -103,6 +104,7 @@
else
attack_hand(user)
return
*/
/obj/machinery/computer/pod/attack_ai(var/mob/user as mob)
+29 -15
View File
@@ -1,7 +1,7 @@
// the power monitoring computer
// for the moment, just report the status of all APCs in the same powernet
/obj/machinery/power/monitor
name = "power monitoring computer"
name = "Power Monitoring Computer"
desc = "It monitors power levels across the station."
icon = 'icons/obj/computer.dmi'
icon_state = "power"
@@ -94,25 +94,39 @@
var/obj/machinery/power/apc/A = term.master
L += A
t += "<PRE>Total power: [powernet.avail] W<BR>Total load: [num2text(powernet.viewload,10)] W<BR>"
t += "<FONT SIZE=-1>"
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\computer\power.dm:97: t += "<PRE>Total power: [powernet.avail] W<BR>Total load: [num2text(powernet.viewload,10)] W<BR>"
t += {"<PRE>Total power: [powernet.avail] W<BR>Total load: [num2text(powernet.viewload,10)] W<BR>
<FONT SIZE=-1>"}
// END AUTOFIX
var/list/State = list("<font color=red> Off</font>",
"<font color=red>AOff</font>",
"<font color=green> On</font>",
"<font color=green> AOn</font>")
var/list/chg = list("Not charging",
"Charging",
"Fully charged")
// Start of power report table
// Table header
t += {"<TABLE>
<TH><TR><B><TD>Area</TD><TD>Eqp.</TD><TD>Lgt.</TD><TD>Env.</TD><TD>Load</TD><TD>Cell</TD></B></TR></TH>"}
if(L.len > 0)
t += "Area Eqp./Lgt./Env. Load Cell<HR>"
var/list/S = list(" Off","AOff"," On", " AOn")
var/list/chg = list("N","C","F")
// Each entry
for(var/obj/machinery/power/apc/A in L)
t += {"<TR>
<TD> [get_area_master() ]</TD>
<TD> [State[A.equipment+1]]</TD>
<TD> [State[A.lighting+1 ]]</TD>
<TD> [State[A.environ+1 ]]</TD>
<TD> [A.lastused_total ]</TD>
<TD>[A.cell ? "[round(A.cell.percent())]% [chg[A.charging+1]]" : " N/C"] </TD>
</TR>"}
t += copytext(add_tspace("\The [A.area]", 30), 1, 30)
t += " [S[A.equipment+1]] [S[A.lighting+1]] [S[A.environ+1]] [add_lspace(A.lastused_total, 6)] [A.cell ? "[add_lspace(round(A.cell.percent()), 3)]% [chg[A.charging+1]]" : " N/C"]<BR>"
t += "</TABLE></FONT></PRE></TT>"
// End of powa report
t += "</FONT></PRE></TT>"
user << browse(t, "window=powcomp;size=420x900")
user << browse(t, "window=powcomp;size=640x800")
onclose(user, "powcomp")
+50
View File
@@ -17,6 +17,7 @@
..()
initialize_directions = dir
/obj/machinery/atmospherics/unary/cryo_cell/initialize()
if(node) return
var/node_connect = dir
@@ -25,6 +26,55 @@
node = target
break
/obj/machinery/atmospherics/unary/cryo_cell/Destroy()
go_out()
var/obj/item/weapon/reagent_containers/glass/B = beaker
if(beaker)
B.loc = get_step(loc, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube
..()
/obj/machinery/atmospherics/unary/cryo_cell/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
if(O.loc == user) //no you can't pull things out of your ass
return
if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.resting) //are you cuffed, dying, lying, stunned or other
return
if(O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src)) // is the mob anchored, too far away from you, or are you too far away from the source
return
if(!ismob(O)) //humans only
return
if(istype(O, /mob/living/simple_animal) || istype(O, /mob/living/silicon)) //animals and robutts dont fit
return
if(!ishuman(user) && !isrobot(user)) //No ghosts or mice putting people into the sleeper
return
if(user.loc==null) // just in case someone manages to get a closet into the blue light dimension, as unlikely as that seems
return
if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc?
return
if(occupant)
user << "\blue <B>The cryo cell is already occupied!</B>"
return
if(isrobot(user))
if(!istype(user:module, /obj/item/weapon/robot_module/medical))
user << "<span class='warning'>You do not have the means to do this!</span>"
return
var/mob/living/L = O
if(!istype(L) || L.buckled)
return
if(L.abiotic())
user << "\red <B>Subject cannot have abiotic items on.</B>"
return
for(var/mob/living/carbon/slime/M in range(1,L))
if(M.Victim == L)
usr << "[L.name] will not fit into the cryo cell because they have a slime latched onto their head."
return
if(put_mob(L))
if(L == user)
visible_message("[user] climbs into the cryo cell.", 3)
else
visible_message("[user] puts [L.name] into the cryo cell.", 3)
if(user.pulling == L)
user.pulling = null
/obj/machinery/atmospherics/unary/cryo_cell/process()
..()
if(!node)
@@ -59,7 +59,7 @@
Topic(href, href_list)
..()
if (usr.stat || usr.restrained() || !ishuman(usr))
if (usr.stat || usr.restrained() || (!ishuman(usr) && !istype(usr,/mob/living/silicon)))
return
if (href_list["close"])
usr << browse(null, "window=airlock")
+10 -2
View File
@@ -81,6 +81,14 @@
else
flick("door_deny", src)
return
if(istype(AM, /obj/structure/stool/bed/chair/wheelchair))
var/obj/structure/stool/bed/chair/wheelchair/wheel = AM
if(density)
if(wheel.pulling && (src.allowed(wheel.pulling)))
open()
else
flick("door_deny", src)
return
return
@@ -246,7 +254,7 @@
door_animate("closing")
src.density = 1
explosion_resistance = initial(explosion_resistance)
src.layer = 3.1
src.layer = 3.0
sleep(10)
update_icon()
if(visible && !glass)
@@ -291,4 +299,4 @@
update_nearby_tiles()
/obj/machinery/door/morgue
icon = 'icons/obj/doors/doormorgue.dmi'
icon = 'icons/obj/doors/doormorgue.dmi'
+5 -3
View File
@@ -181,7 +181,6 @@
return
/obj/machinery/door/firedoor/proc/latetoggle()
if(operating || stat & NOPOWER || !nextstate)
return
@@ -195,12 +194,15 @@
return
/obj/machinery/door/firedoor/close()
..()
latetoggle()
return ..()
layer = 3.1
/obj/machinery/door/firedoor/open()
..()
latetoggle()
return ..()
layer = 2.6
/obj/machinery/door/firedoor/door_animate(animation)
+4 -1
View File
@@ -33,6 +33,9 @@ var/const/HOLOPAD_MODE = 0
name = "\improper AI holopad"
desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely."
icon_state = "holopad0"
layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them.
var/mob/living/silicon/ai/master//Which AI, if any, is controlling the object? Only one AI may control a hologram at any time.
var/last_request = 0 //to prevent request spam. ~Carn
var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating.
@@ -210,4 +213,4 @@ Holographic project of everything else.
name = "hologram projector"
desc = "It makes a hologram appear...with magnets or something..."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "hologram0"
icon_state = "hologram0"
+2 -1
View File
@@ -155,7 +155,8 @@
src.occupant.attack_log += "\[[time_stamp()]\] Was gibbed by <b>[user]/[user.ckey]</b>" //One shall not simply gib a mob unnoticed!
user.attack_log += "\[[time_stamp()]\] Gibbed <b>[src.occupant]/[src.occupant.ckey]</b>"
msg_admin_attack("[user.name] ([user.ckey]) gibbed [src.occupant] ([src.occupant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(src.occupant.ckey)
msg_admin_attack("[user.name] ([user.ckey]) gibbed [src.occupant] ([src.occupant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(!iscarbon(user))
src.occupant.LAssailant = null
else
+7 -1
View File
@@ -25,6 +25,7 @@ Growing it to term with nothing injected will grab a ghost from the observers. *
gender = MALE
var/obj/machinery/hydroponics/parent = null
var/found_player = 0
var/beingharvested = 0
/obj/item/seeds/replicapod/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -73,7 +74,12 @@ Growing it to term with nothing injected will grab a ghost from the observers. *
parent = loc
// var/found_player = 0
user.visible_message("\blue [user] carefully begins to open the pod...","\blue You carefully begin to open the pod...")
if(beingharvested)
user << ("\red You can only harvest the pod once!")
else
user.visible_message("\blue [user] carefully begins to open the pod...","\blue You carefully begin to open the pod...")
beingharvested = 1
//If a sample is injected (and revival is allowed) the plant will be controlled by the original donor.
if(source && source.stat == 2 && source.client && source.ckey && config.revival_pod_plants)
+1 -1
View File
@@ -90,7 +90,7 @@ var/const/SAFETY_COOLDOWN = 100
/obj/machinery/recycler/proc/recycle(var/obj/item/I, var/sound = 1)
I.loc = src.loc
if(!istype(I, /obj/item/weapon/disk/nuclear))
if(!istype(I, /obj/item/weapon/disk/nuclear) && !istype(I,/obj/item/flag/nation))
del(I)
if(prob(15))
new /obj/item/stack/sheet/metal(loc)
+550 -1
View File
@@ -567,4 +567,553 @@
return
//////////////////////////////REMINDER: Make it lock once you place some fucker inside.
//////////////////////////////REMINDER: Make it lock once you place some fucker inside.
//God this entire file is fucking awful
//Suit painter for Bay's special snowflake aliums.
/obj/machinery/suit_cycler
name = "suit cycler"
desc = "An industrial machine for repairing, painting and equipping hardsuits."
anchored = 1
density = 1
icon = 'icons/obj/suitstorage.dmi'
icon_state = "suitstorage000000100"
req_access = list(access_captain,access_heads)
var/active = 0 // PLEASE HOLD.
var/safeties = 1 // The cycler won't start with a living thing inside it unless safeties are off.
var/irradiating = 0 // If this is > 0, the cycler is decontaminating whatever is inside it.
var/radiation_level = 2 // 1 is removing germs, 2 is removing blood, 3 is removing phoron.
var/model_text = "" // Some flavour text for the topic box.
var/locked = 1 // If locked, nothing can be taken from or added to the cycler.
// Wiring bollocks.
var/wires = 15
var/electrified = 0
var/const/WIRE_EXTEND = 1 // Safeties
var/const/WIRE_SCANID = 2 // Locked status
var/const/WIRE_SHOCK = 3 // What it says on the tin.
//Departments that the cycler can paint suits to look like.
var/list/departments = list("Engineering","Mining","Medical","Security","Atmos")
//Species that the suits can be configured to fit.
var/list/species = list("Human","Skrell","Unathi","Tajaran")
var/target_department = "Engineering"
var/target_species = "Human"
var/mob/living/carbon/human/occupant = null
var/obj/item/clothing/suit/space/rig/suit = null
var/obj/item/clothing/head/helmet/space/helmet = null
/obj/machinery/suit_cycler/engineering
name = "Engineering suit cycler"
model_text = "Engineering"
req_access = list(access_construction)
departments = list("Engineering","Atmos")
species = list("Human","Unathi","Tajaran")
/obj/machinery/suit_cycler/mining
name = "Mining suit cycler"
model_text = "Mining"
req_access = list(access_mining)
departments = list("Mining")
species = list("Human","Unathi","Tajaran")
/obj/machinery/suit_cycler/attack_ai(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/suit_cycler/attack_paw(mob/user as mob)
user << "\blue The console controls are far too complicated for your tiny brain!"
return
/obj/machinery/suit_cycler/attackby(obj/item/I as obj, mob/user as mob)
if(electrified != 0)
if(src.shock(user, 100))
return
//Hacking init.
if(istype(I, /obj/item/device/multitool) || istype(I, /obj/item/weapon/wirecutters))
if(panel_open)
attack_hand(user)
return
//Other interface stuff.
if(istype(I, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = I
if(!(ismob(G.affecting)))
return
if(locked)
user << "\red The suit cycler is locked."
return
if(src.contents.len > 0)
user << "\red There is no room inside the cycler for [G.affecting.name]."
return
visible_message("[user] starts putting [G.affecting.name] into the suit cycler.", 3)
if(do_after(user, 20))
if(!G || !G.affecting) return
var/mob/M = G.affecting
if (M.client)
M.client.perspective = EYE_PERSPECTIVE
M.client.eye = src
M.loc = src
src.occupant = M
src.add_fingerprint(user)
del(G)
src.updateUsrDialog()
return
else if(istype(I,/obj/item/weapon/screwdriver))
panel_open = !panel_open
user << "You [panel_open ? "open" : "close"] the maintenance panel."
src.updateUsrDialog()
return
else if(istype(I,/obj/item/weapon/card/emag))
if(emagged)
user << "\red The cycler has already been subverted."
return
var/obj/item/weapon/card/emag/E = I
src.updateUsrDialog()
E.uses--
//Clear the access reqs, disable the safeties, and open up all paintjobs.
user << "\red You run the sequencer across the interface, corrupting the operating protocols."
departments = list("Engineering","Mining","Medical","Security","Atmos","^%###^%$")
emagged = 1
safeties = 0
req_access = list()
return
else if(istype(I,/obj/item/clothing/head/helmet/space))
if(locked)
user << "\red The suit cycler is locked."
return
if(helmet)
user << "The cycler already contains a helmet."
return
user << "You fit \the [I] into the suit cycler."
user.drop_item()
I.loc = src
helmet = I
src.update_icon()
src.updateUsrDialog()
return
else if(istype(I,/obj/item/clothing/suit/space/rig))
if(locked)
user << "\red The suit cycler is locked."
return
if(suit)
user << "The cycler already contains a hardsuit."
return
var/obj/item/clothing/suit/space/rig/S = I
if(S.helmet)
user << "\The [S] will not fit into the cycler with a helmet attached."
return
if(S.boots)
user << "\The [S] will not fit into the cycler with boots attached."
return
user << "You fit \the [I] into the suit cycler."
user.drop_item()
I.loc = src
suit = I
src.update_icon()
src.updateUsrDialog()
return
..()
/obj/machinery/suit_cycler/attack_hand(mob/user as mob)
add_fingerprint(user)
if(..() || stat & (BROKEN|NOPOWER))
return
if(electrified != 0)
if(src.shock(user, 100))
return
usr.set_machine(src)
var/dat = "<HEAD><TITLE>Suit Cycler Interface</TITLE></HEAD>"
if(src.active)
dat+= "<br><font color='red'><B>The [model_text ? "[model_text] " : ""]suit cycler is currently in use. Please wait...</b></font>"
else if(locked)
dat += "<br><font color='red'><B>The [model_text ? "[model_text] " : ""]suit cycler is currently locked. Please contact your system administrator.</b></font>"
if(src.allowed(usr))
dat += "<br><a href='?src=\ref[src];toggle_lock=1'>\[unlock unit\]</a>"
else
dat += "<h1>Suit cycler</h1>"
dat += "<B>Welcome to the [model_text ? "[model_text] " : ""]suit cycler control panel. <a href='?src=\ref[src];toggle_lock=1'>\[lock unit\]</a></B><HR>"
dat += "<h2>Maintenance</h2>"
dat += "<b>Helmet: </b> [helmet ? "\the [helmet]" : "no helmet stored" ]. <A href='?src=\ref[src];eject_helmet=1'>\[eject\]</a><br/>"
dat += "<b>Suit: </b> [suit ? "\the [suit]" : "no suit stored" ]. <A href='?src=\ref[src];eject_suit=1'>\[eject\]</a>"
if(suit && istype(suit))
dat += "[(suit.damage ? " <A href='?src=\ref[src];repair_suit=1'>\[repair\]</a>" : "")]"
dat += "<br/><b>UV decontamination systems:</b> <font color = '[emagged ? "red'>SYSTEM ERROR" : "green'>READY"]</font><br>"
dat += "Output level: [radiation_level]<br>"
dat += "<A href='?src=\ref[src];select_rad_level=1'>\[select power level\]</a> <A href='?src=\ref[src];begin_decontamination=1'>\[begin decontamination cycle\]</a><br><hr>"
dat += "<h2>Customisation</h2>"
dat += "<b>Target product: <A href='?src=\ref[src];select_department=1'>[target_department]</a>, <A href='?src=\ref[src];select_species=1'>[target_species]</a>."
dat += "<A href='?src=\ref[src];apply_paintjob=1'><br>\[apply customisation routine\]</a><br><hr>"
/* if(panel_open)
var/list/vendwires = list(
"Violet" = 1,
"Orange" = 2,
"Goldenrod" = 3,
)
dat += "<h2><B>Access Panel</B></h2>"
for(var/wiredesc in vendwires)
var/is_uncut = src.wires & APCWireColorToFlag[vendwires[wiredesc]]
dat += "[wiredesc] wire: "
if(!is_uncut)
dat += "<a href='?src=\ref[src];cutwire=[vendwires[wiredesc]]'>Mend</a>"
else
dat += "<a href='?src=\ref[src];cutwire=[vendwires[wiredesc]]'>Cut</a> "
dat += "<a href='?src=\ref[src];pulsewire=[vendwires[wiredesc]]'>Pulse</a> "
dat += "<br>"
dat += "<br>"
dat += "The orange light is [(electrified == 0) ? "off" : "on"].<BR>"
dat += "The red light is [safeties ? "blinking" : "off"].<BR>"
dat += "The yellow light is [locked ? "on" : "off"].<BR>" */
user << browse(dat, "window=suit_cycler")
onclose(user, "suit_cycler")
return
/obj/machinery/suit_cycler/Topic(href, href_list)
if(href_list["eject_suit"])
if(!suit) return
suit.loc = get_turf(src)
suit = null
else if(href_list["eject_helmet"])
if(!helmet) return
helmet.loc = get_turf(src)
helmet = null
else if(href_list["select_department"])
target_department = input("Please select the target department paintjob.","Suit cycler",null) as null|anything in departments
else if(href_list["select_species"])
target_species = input("Please select the target species configuration.","Suit cycler",null) as null|anything in species
else if(href_list["select_rad_level"])
var/choices = list(1,2,3)
if(emagged)
choices = list(1,2,3,4,5)
radiation_level = input("Please select the desired radiation level.","Suit cycler",null) as null|anything in choices
else if(href_list["repair_suit"])
if(!suit) return
active = 1
spawn(100)
repair_suit()
finished_job()
else if(href_list["apply_paintjob"])
if(!suit && !helmet) return
active = 1
spawn(100)
apply_paintjob()
finished_job()
else if(href_list["toggle_safties"])
safeties = !safeties
else if(href_list["toggle_lock"])
if(src.allowed(usr))
locked = !locked
usr << "You [locked ? "" : "un"]lock \the [src]."
else
usr << "\red Access denied."
else if(href_list["begin_decontamination"])
if(safeties && occupant)
usr << "\red The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle."
return
active = 1
irradiating = 10
src.updateUsrDialog()
sleep(10)
if(helmet)
if(radiation_level > 2)
helmet.decontaminate()
if(radiation_level > 1)
helmet.clean_blood()
if(suit)
if(radiation_level > 2)
suit.decontaminate()
if(radiation_level > 1)
suit.clean_blood()
/* else if ((href_list["cutwire"]) && (src.panel_open))
var/twire = text2num(href_list["cutwire"])
if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) ))
usr << "You need wirecutters!"
return
if (src.isWireColorCut(twire))
src.mend(twire)
else
src.cut(twire)
else if ((href_list["pulsewire"]) && (src.panel_open))
var/twire = text2num(href_list["pulsewire"])
if (!istype(usr.get_active_hand(), /obj/item/device/multitool))
usr << "You need a multitool!"
return
if (src.isWireColorCut(twire))
usr << "You can't pulse a cut wire."
return
else
src.pulse(twire)*/
src.updateUsrDialog()
return
/obj/machinery/suit_cycler/process()
if(electrified > 0)
electrified--
if(!active)
return
if(active && stat & (BROKEN|NOPOWER))
active = 0
irradiating = 0
electrified = 0
return
if(irradiating == 1)
finished_job()
irradiating = 0
return
irradiating--
if(occupant)
if(prob(radiation_level*2)) occupant.emote("scream")
if(radiation_level > 2)
occupant.take_organ_damage(0,radiation_level*2 + rand(1,3))
if(radiation_level > 1)
occupant.take_organ_damage(0,radiation_level + rand(1,3))
occupant.radiation += radiation_level*10
/obj/machinery/suit_cycler/proc/finished_job()
var/turf/T = get_turf(src)
T.visible_message("\The [src] pings loudly.")
icon_state = initial(icon_state)
active = 0
src.updateUsrDialog()
/obj/machinery/suit_cycler/proc/repair_suit()
if(!suit || !suit.damage || !suit.can_breach)
return
suit.breaches = list()
suit.calc_breach_damage()
return
/obj/machinery/suit_cycler/verb/leave()
set name = "Eject Cycler"
set category = "Object"
set src in oview(1)
if (usr.stat != 0)
return
eject_occupant(usr)
/obj/machinery/suit_cycler/proc/eject_occupant(mob/user as mob)
if(locked || active)
user << "\red The cycler is locked."
return
if (!occupant)
return
if (occupant.client)
occupant.client.eye = occupant.client.mob
occupant.client.perspective = MOB_PERSPECTIVE
occupant.loc = get_turf(occupant)
occupant = null
add_fingerprint(usr)
src.updateUsrDialog()
src.update_icon()
return
/*
//HACKING PROCS, MOSTLY COPIED FROM VENDING MACHINES
/obj/machinery/suit_cycler/proc/isWireColorCut(var/wireColor)
var/wireFlag = APCWireColorToFlag[wireColor]
return ((src.wires & wireFlag) == 0)
/obj/machinery/suit_cycler/proc/isWireCut(var/wireIndex)
var/wireFlag = APCIndexToFlag[wireIndex]
return ((src.wires & wireFlag) == 0)
/obj/machinery/suit_cycler/proc/cut(var/wireColor)
var/wireFlag = APCWireColorToFlag[wireColor]
var/wireIndex = APCWireColorToIndex[wireColor]
src.wires &= ~wireFlag
switch(wireIndex)
if(WIRE_EXTEND)
safeties = 0
if(WIRE_SHOCK)
electrified = -1
if (WIRE_SCANID)
locked = 0
/obj/machinery/suit_cycler/proc/mend(var/wireColor)
var/wireFlag = APCWireColorToFlag[wireColor]
var/wireIndex = APCWireColorToIndex[wireColor] //not used in this function
src.wires |= wireFlag
switch(wireIndex)
if(WIRE_SHOCK)
src.electrified = 0
/obj/machinery/suit_cycler/proc/pulse(var/wireColor)
var/wireIndex = APCWireColorToIndex[wireColor]
switch(wireIndex)
if(WIRE_EXTEND)
safeties = !locked
if(WIRE_SHOCK)
electrified = 30
if (WIRE_SCANID)
locked = !locked
*/
/obj/machinery/suit_cycler/proc/shock(mob/user, prb)
if(stat & (BROKEN|NOPOWER)) // unpowered, no shock
return 0
if(!prob(prb))
return 0
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
if (electrocute_mob(user, get_area(src), src, 0.7))
return 1
else
return 0
//There HAS to be a less bloated way to do this. TODO: some kind of table/icon name coding? ~Z
/obj/machinery/suit_cycler/proc/apply_paintjob()
if(!target_species || !target_department)
return
switch(target_species)
if("Human" || "Skrell")
if(helmet) helmet.species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox")
if(suit) suit.species_restricted = list("exclude","Unathi","Tajaran","Diona","Vox")
if("Unathi")
if(helmet) helmet.species_restricted = list("Unathi")
if(suit) suit.species_restricted = list("Unathi")
if("Tajaran")
if(helmet) helmet.species_restricted = list("Tajaran")
if(suit) suit.species_restricted = list("Tajaran")
switch(target_department)
if("Engineering")
if(helmet)
helmet.name = "engineering hardsuit helmet"
helmet.icon_state = "rig0-engineering"
helmet.item_state = "eng_helm"
helmet._color = "engineering"
if(suit)
suit.name = "engineering hardsuit"
suit.icon_state = "rig-engineering"
suit.item_state = "eng_hardsuit"
if("Mining")
if(helmet)
helmet.name = "mining hardsuit helmet"
helmet.icon_state = "rig0-mining"
helmet.item_state = "mining_helm"
helmet._color = "mining"
if(suit)
suit.name = "mining hardsuit"
suit.icon_state = "rig-mining"
suit.item_state = "mining_hardsuit"
if("Medical")
if(helmet)
helmet.name = "medical hardsuit helmet"
helmet.icon_state = "rig0-medical"
helmet.item_state = "medical_helm"
helmet._color = "medical"
if(suit)
suit.name = "medical hardsuit"
suit.icon_state = "rig-medical"
suit.item_state = "medical_hardsuit"
if("Security")
if(helmet)
helmet.name = "security hardsuit helmet"
helmet.icon_state = "rig0-sec"
helmet.item_state = "sec_helm"
helmet._color = "sec"
if(suit)
suit.name = "security hardsuit"
suit.icon_state = "rig-sec"
suit.item_state = "sec_hardsuit"
if("Atmos")
if(helmet)
helmet.name = "atmospherics hardsuit helmet"
helmet.icon_state = "rig0-atmos"
helmet.item_state = "atmos_helm"
helmet._color = "atmos"
if(suit)
suit.name = "atmospherics hardsuit"
suit.icon_state = "rig-atmos"
suit.item_state = "atmos_hardsuit"
if("^%###^%$")
if(helmet)
helmet.name = "blood-red hardsuit helmet"
helmet.icon_state = "rig0-syndie"
helmet.item_state = "syndie_helm"
helmet._color = "syndie"
if(suit)
suit.name = "blood-red hardsuit"
suit.item_state = "syndie_hardsuit"
suit.icon_state = "rig-syndie"
+4 -1
View File
@@ -288,7 +288,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes.
continue
// Ghosts hearing all radio chat don't want to hear syndicate intercepts, they're duplicates
if(data == 3 && istype(R, /mob/dead/observer) && R.client && (R.client.prefs.toggles & CHAT_GHOSTRADIO))
continue
// --- Check for compression ---
if(compression > 0)
+14
View File
@@ -176,6 +176,20 @@
user << "<span class='notice'>You insert [W] into [src].</span>"
return
else if(istype(W, /obj/item/weapon/wrench))
if(do_after(user, 20))
if(!src) return
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
switch (anchored)
if (0)
anchored = 1
user.visible_message("[user] tightens the bolts securing \the [src] to the floor.", "You tighten the bolts securing \the [src] to the floor.")
if (1)
user.visible_message("[user] unfastens the bolts securing \the [src] to the floor.", "You unfasten the bolts securing \the [src] to the floor.")
anchored = 0
return
else if(src.panel_open)
for(var/datum/data/vending_product/R in product_records)
if(istype(W, R.product_path))
+47 -4
View File
@@ -340,6 +340,11 @@
/obj/machinery/mecha_part_fabricator/proc/build_part(var/obj/item/part)
if(!part) return
// critical exploit prevention, do not remove unless you replace it -walter0o
if( !(locate(part, src.contents)) || !(part.vars.Find("construction_time")) || !(part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator
return
src.being_built = new part.type(src)
src.desc = "It's building [src.being_built]."
src.remove_resources(part)
@@ -569,9 +574,26 @@
onclose(user, "mecha_fabricator")
return
/obj/machinery/mecha_part_fabricator/proc/exploit_prevention(var/obj/Part, mob/user as mob, var/desc_exploit)
// critical exploit prevention, feel free to improve or replace this, but do not remove it -walter0o
if(!Part || !user || !istype(Part) || !istype(user)) // sanity
return 1
if( !(locate(Part, src.contents)) || !(Part.vars.Find("construction_time")) || !(Part.vars.Find("construction_cost")) ) // these 3 are the current requirements for an object being buildable by the mech_fabricator
var/turf/LOC = get_turf(user)
message_admins("[key_name_admin(user)] tried to exploit an Exosuit Fabricator to [desc_exploit ? "get the desc of" : "duplicate"] <a href='?_src_=vars;Vars=\ref[Part]'>[Part]</a> ! ([LOC ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[LOC.x];Y=[LOC.y];Z=[LOC.z]'>JMP</a>" : "null"])", 0)
log_admin("EXPLOIT : [key_name(user)] tried to exploit an Exosuit Fabricator to [desc_exploit ? "get the desc of" : "duplicate"] [Part] !")
return 1
return null
/obj/machinery/mecha_part_fabricator/Topic(href, href_list)
..()
if(..()) // critical exploit prevention, do not remove unless you replace it -walter0o
return
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
if(href_list["part_set"])
var/tpart_set = filter.getStr("part_set")
@@ -582,13 +604,25 @@
src.part_set = tpart_set
screen = "parts"
if(href_list["part"])
var/list/part = filter.getObj("part")
var/obj/part = filter.getObj("part")
// critical exploit prevention, do not remove unless you replace it -walter0o
if(src.exploit_prevention(part, usr))
return
if(!processing_queue)
build_part(part)
else
add_to_queue(part)
if(href_list["add_to_queue"])
add_to_queue(filter.getObj("add_to_queue"))
var/obj/part = filter.getObj("add_to_queue")
// critical exploit prevention, do not remove unless you replace it -walter0o
if(src.exploit_prevention(part, usr))
return
add_to_queue(part)
return update_queue_on_page()
if(href_list["remove_from_queue"])
remove_from_queue(filter.getNum("remove_from_queue"))
@@ -627,7 +661,12 @@
return update_queue_on_page()
if(href_list["part_desc"])
var/obj/part = filter.getObj("part_desc")
if(part)
// critical exploit prevention, do not remove unless you replace it -walter0o
if(src.exploit_prevention(part, usr, 1))
return
if(part)
temp = {"<h1>[part] description:</h1>
[part.desc]<br>
<a href='?src=\ref[src];clear_temp=1'>Return</a>
@@ -758,6 +797,10 @@
sleep(10)
if(stack && stack.amount)
while(src.resources[material] < res_max_amount && stack)
if(stack.amount < 0 || !stack)
user.drop_item(stack)
qdel(stack)
break
src.resources[material] += amnt
stack.use(1)
count++
+25 -19
View File
@@ -184,40 +184,45 @@
anchored = 1
density = 0
layer = 2
var/health = 15
var/obj/effect/alien/weeds/node/linked_node = null
/obj/effect/alien/weeds/Destroy()
if(linked_node)
linked_node.connected_weeds.Remove(src)
linked_node = null
..()
/obj/effect/alien/weeds/node
icon_state = "weednode"
name = "purple sac"
desc = "Weird purple octopus-like thing."
layer = 3
luminosity = NODERANGE
var/node_range = NODERANGE
var/list/obj/effect/alien/weeds/spawns
var/list/obj/effect/alien/weeds/connected_weeds
/obj/effect/alien/weeds/node/Destroy()
for(var/obj/effect/alien/weeds/W in spawns)
if(W.linked_node == src)
W.linked_node = null
..()
/obj/effect/alien/weeds/Destroy()
if(linked_node)
linked_node.spawns.Remove(src)
for(var/obj/effect/alien/weeds/W in connected_weeds)
W.linked_node = null
..()
/obj/effect/alien/weeds/node/New()
spawns = new()
connected_weeds = new()
..(src.loc, src)
/obj/effect/alien/weeds/New(pos, var/obj/effect/alien/weeds/node/node)
/obj/effect/alien/weeds/New(pos, var/obj/effect/alien/weeds/node/N)
..()
linked_node = node
linked_node.spawns.Add(src)
if(istype(loc, /turf/space))
del(src)
qdel(src)
return
linked_node = N
if(linked_node)
linked_node.connected_weeds.Add(src)
if(icon_state == "weeds")icon_state = pick("weeds", "weeds1", "weeds2")
spawn(rand(150, 200))
if(src)
@@ -243,17 +248,18 @@ Alien plants should do something if theres a lot of poison
if (istype(U, /turf/space))
del(src)
return
if(!linked_node || (get_dist(linked_node, src) > linked_node.node_range) )
return
direction_loop:
for(var/dirn in cardinal)
var/turf/T = get_step(src, dirn)
if (!istype(T) || T.density || locate(/obj/effect/alien/weeds) in T || istype(T.loc, /area/arrival) || istype(T, /turf/space))
continue
if(!linked_node || get_dist(linked_node, src) > linked_node.node_range)
return
// if (locate(/obj/movable, T)) // don't propogate into movables
// continue
+13
View File
@@ -86,6 +86,19 @@
landmarks_list -= src
..()
/obj/effect/landmark/nations
name = "nations"
icon = 'icons/mob/screen1.dmi'
icon_state = "x"
anchored = 1.0
/obj/effect/landmark/nations/New()
..()
tag = "nations*[name]"
invisibility = 101
return 1
/obj/effect/landmark/start
name = "start"
icon = 'icons/mob/screen1.dmi'
+15 -6
View File
@@ -40,6 +40,14 @@
var/list/allowed = null //suit storage stuff.
var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers.
/* Species-specific sprites, concept stolen from Paradise//vg/.
ex:
sprite_sheets = list(
"Tajaran" = 'icons/cat/are/bad'
)
If index term exists and icon_override is not set, this sprite sheet will be used.
*/
var/list/sprite_sheets = null
var/icon_override = null //Used to override hardcoded clothing dmis in human clothing proc.
var/list/species_fit = null //This object has a different appearance when worn by these species
@@ -126,14 +134,14 @@
return
/obj/item/attack_hand(mob/user as mob)
if (!user) return
if (!user) return 0
if (hasorgans(user))
var/datum/organ/external/temp = user:organs_by_name["r_hand"]
if (user.hand)
temp = user:organs_by_name["l_hand"]
if(temp && !temp.is_usable())
user << "<span class='notice'>You try to move your [temp.display_name], but cannot!"
return
return 0
if (istype(src.loc, /obj/item/weapon/storage))
//If the item is in a storage item, take it out
@@ -144,17 +152,17 @@
if (src.loc == user)
//canremove==0 means that object may not be removed. You can still wear it. This only applies to clothing. /N
if(!src.canremove)
return
return 0
else
user.u_equip(src)
else
if(isliving(src.loc))
return
return 0
user.next_move = max(user.next_move+2,world.time + 2)
src.pickup(user)
add_fingerprint(user)
user.put_in_active_hand(src)
return
return 1
/obj/item/attack_paw(mob/user as mob)
@@ -575,7 +583,8 @@
user.attack_log += "\[[time_stamp()]\]<font color='red'> Attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
msg_admin_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)") //BS12 EDIT ALG
if(M.ckey)
msg_admin_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)") //BS12 EDIT ALG
if(!iscarbon(user))
M.LAssailant = null
+1
View File
@@ -5,6 +5,7 @@
desc = "A folded bag designed for the storage and transportation of cadavers."
icon = 'icons/obj/bodybag.dmi'
icon_state = "bodybag_folded"
w_class = 2.0
attack_self(mob/user)
var/obj/structure/closet/body_bag/R = new /obj/structure/closet/body_bag(user.loc)
+2 -1
View File
@@ -37,7 +37,8 @@
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been flashed (attempt) with [src.name] by [user.name] ([user.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to flash [M.name] ([M.ckey])</font>")
msg_admin_attack("[user.name] ([user.ckey]) Used the [src.name] to flash [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(M.ckey)
msg_admin_attack("[user.name] ([user.ckey]) Used the [src.name] to flash [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(!iscarbon(user))
M.LAssailant = null
+10 -1
View File
@@ -110,6 +110,15 @@
flags = FPRINT | TABLEPASS | CONDUCT
brightness_on = 2
/obj/item/device/flashlight/drone
name = "low-power flashlight"
desc = "A miniature lamp, that might be used by small robots."
icon_state = "penlight"
item_state = ""
flags = FPRINT | TABLEPASS | CONDUCT
brightness_on = 2
w_class = 1
// the desk lamps are a bit special
/obj/item/device/flashlight/lamp
@@ -195,4 +204,4 @@
user.visible_message("<span class='notice'>[user] activates the flare.</span>", "<span class='notice'>You pull the cord on the flare, activating it!</span>")
src.force = on_damage
src.damtype = "fire"
processing_objects += src
processing_objects += src
@@ -23,7 +23,6 @@
if (!target)
usr.unset_machine()
usr.reset_view(usr)
src.in_use = 0
return
for (var/obj/machinery/camera/C in cameras)
if (C.c_tag == target)
@@ -34,10 +33,8 @@
usr.client.eye = target
usr.set_machine(src)
src.current = target
src.in_use = 1
else
usr.unset_machine()
src.in_use = 0
return
/obj/item/device/handtv/check_eye(var/mob/usr as mob)
+57
View File
@@ -0,0 +1,57 @@
#define MODKIT_HELMET 1
#define MODKIT_SUIT 2
#define MODKIT_FULL 3
/obj/item/device/modkit
name = "hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user."
icon_state = "modkit"
var/parts = MODKIT_FULL
var/list/target_species = list("Human","Skrell")
var/list/permitted_types = list(
/obj/item/clothing/head/helmet/space/rig,
/obj/item/clothing/suit/space/rig
)
/obj/item/device/modkit/afterattack(obj/O, mob/user as mob)
if(!parts)
user << "<span class='warning'>This kit has no parts for this modification left.</span>"
user.drop_from_inventory(src)
del(src)
return
/* TODO: list comparison
if(istype(O,to_type))
user << "<span class='notice'>[O] is already modified.</span>"
return
*/
if(!isturf(O.loc))
user << "<span class='warning'>[O] must be safely placed on the ground for modification.</span>"
return
playsound(user.loc, 'sound/items/Screwdriver.ogg', 100, 1)
user.visible_message("\red [user] opens \the [src] and modifies \the [O].","\red You open \the [src] and modify \the [O].")
var/obj/item/clothing/I = O
if(istype(I))
I.species_restricted = target_species.Copy()
parts--
if(!parts)
user.drop_from_inventory(src)
del(src)
/obj/item/device/modkit/tajaran
name = "tajaran hardsuit modification kit"
desc = "A kit containing all the needed tools and parts to modify a hardsuit for another user. This one looks like it's meant for Tajara."
target_species = list("Tajaran")
/obj/item/device/modkit/examine()
..()
usr << "It looks as though it modifies hardsuits to fit the following users:"
for(var/species in target_species)
usr << "- [species]"
+11 -1
View File
@@ -6,20 +6,30 @@ A list of items and costs is stored under the datum of every game mode, alongsid
*/
var/list/world_uplinks = list()
/obj/item/device/uplink
var/welcome // Welcoming menu message
var/uses // Numbers of crystals
// List of items not to shove in their hands.
var/list/purchase_log = list()
var/purchase_log = ""
var/show_description = null
var/active = 0
var/job = null
var/uplink_owner = null//text-only
var/used_TC = 0
/obj/item/device/uplink/New()
..()
world_uplinks+=src
welcome = ticker.mode.uplink_welcome
uses = ticker.mode.uplink_uses
/obj/item/device/uplink/Del()
world_uplinks-=src
..()
//Let's build a menu!
/obj/item/device/uplink/proc/generate_menu(mob/user as mob)
if(!job)
+187 -6
View File
@@ -1,6 +1,82 @@
/obj/item/flag
icon = 'icons/obj/flag.dmi'
w_class = 4.0
var/lit = 0
var/burntime = 30
/obj/item/flag/fire_act(null, temperature, volume)
if(!lit)
Ignite()
return
/obj/item/flag/proc/Ignite()
if(lit) return
lit = 1
update_icons()
processing_objects.Add(src)
/obj/item/flag/process()
burntime--
if(burntime < 1)
processing_objects.Remove(src)
if(istype(src.loc,/turf))
new /obj/effect/decal/cleanable/ash(src.loc)
new /obj/item/stack/rods(src.loc)
del(src)
return
if(istype(src.loc,/mob/living/carbon))
var/mob/living/carbon/C = src.loc
var/turf/location = get_turf(C)
new /obj/effect/decal/cleanable/ash(location)
new /obj/item/stack/rods(location)
del(src)
return
else
del(src)
return
/obj/item/flag/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.isOn())//Badasses dont get blinded while lighting their cig with a welding tool
light("<span class='notice'>[user] casually lights the [name] with [W], what a badass.</span>")
else if(istype(W, /obj/item/weapon/lighter/zippo))
var/obj/item/weapon/lighter/zippo/Z = W
if(Z.lit)
light("<span class='rose'>With a single flick of their wrist, [user] smoothly lights the [name] with their [W]. Damn they're cool.</span>")
else if(istype(W, /obj/item/weapon/lighter))
var/obj/item/weapon/lighter/L = W
if(L.lit)
light("<span class='notice'>After some fiddling, [user] manages to light the [name] with [W].</span>")
else if(istype(W, /obj/item/weapon/match))
var/obj/item/weapon/match/M = W
if(M.lit)
light("<span class='notice'>[user] lights the [name] with their [W].</span>")
else if(istype(W, /obj/item/weapon/melee/energy/sword))
var/obj/item/weapon/melee/energy/sword/S = W
if(S.active)
light("<span class='warning'>[user] swings their [W], barely missing their nose. They light the [name] in the process.</span>")
else if(istype(W, /obj/item/device/assembly/igniter))
light("<span class='notice'>[user] fiddles with [W], and manages to light the [name].</span>")
/obj/item/flag/proc/light(var/flavor_text = "[usr] lights the [name].")
if(!src.lit)
src.lit = 1
var/turf/T = get_turf(src)
T.visible_message(flavor_text)
update_icons()
processing_objects.Add(src)
/obj/item/flag/proc/update_icons()
overlays = null
overlays += image('icons/obj/flag.dmi', src , "fire")
item_state = "[icon_state]_fire"
/obj/item/flag/nt
name = "Nanotrasen flag"
@@ -12,13 +88,76 @@
desc = "The banner of His Majesty, King Squiggles the Eighth."
icon_state = "clownflag"
/obj/item/flag/syndi
name = "Syndicate flag"
desc = "A flag proudly boasting the logo of the Syndicate, in defiance of NT."
icon_state = "syndiflag"
/obj/item/flag/mime
name = "Mime Revolution flag"
desc = "The banner of the glorious revolutionary forces fighting the oppressors on Clown Planet."
icon_state = "mimeflag"
/obj/item/flag/pony
name = "Equestria flag"
desc = "The flag of the independant, sovereign nation of Equestria, whatever the fuck that is."
icon_state = "ponyflag"
/obj/item/flag/ian
name = "Ian flag"
desc = "The banner of Ian, because SQUEEEEE."
icon_state = "ianflag"
//Nations/Department flags
//Species flags
/obj/item/flag/species/slime
name = "Slime People flag"
desc = "A flag proudly proclaiming the superior heritage of Slime People."
icon_state = "slimeflag"
/obj/item/flag/species/skrell
name = "Skrell flag"
desc = "A flag proudly proclaiming the superior heritage of Skrell."
icon_state = "skrellflag"
/obj/item/flag/species/vox
name = "Vox flag"
desc = "A flag proudly proclaiming the superior heritage of Vox."
icon_state = "voxflag"
/obj/item/flag/species/machine
name = "Synthetics flag"
desc = "A flag proudly proclaiming the superior heritage of Synthetics."
icon_state = "machineflag"
/obj/item/flag/species/diona
name = "Diona flag"
desc = "A flag proudly proclaiming the superior heritage of Diona."
icon_state = "dionaflag"
/obj/item/flag/species/human
name = "Human flag"
desc = "A flag proudly proclaiming the superior heritage of Humans."
icon_state = "humanflag"
/obj/item/flag/species/greys
name = "Greys flag"
desc = "A flag proudly proclaiming the superior heritage of Greys."
icon_state = "greysflag"
/obj/item/flag/species/kidan
name = "Kidan flag"
desc = "A flag proudly proclaiming the superior heritage of Kidan."
icon_state = "kidanflag"
/obj/item/flag/species/taj
name = "Tajaran flag"
desc = "A flag proudly proclaiming the superior heritage of Tajaran."
icon_state = "tajflag"
/obj/item/flag/species/unathi
name = "Unathi flag"
desc = "A flag proudly proclaiming the superior heritage of Unathi."
icon_state = "unathiflag"
//Nation Flags (Able to spawn outside Nations gamemode)
/obj/item/flag/cargo
name = "Cargonia flag"
desc = "The flag of the independant, sovereign nation of Cargonia."
@@ -32,4 +171,46 @@
/obj/item/flag/sec
name = "Brigston flag"
desc = "The flag of the independant, sovereign nation of Brigston."
icon_state = "secflag"
icon_state = "secflag"
/obj/item/flag/rnd
name = "Scientopia flag"
desc = "The flag of the independant, sovereign nation of Scientopia."
icon_state = "rndflag"
/obj/item/flag/atmos
name = "Atmosia flag"
desc = "The flag of the independant, sovereign nation of Atmosia."
icon_state = "atmosflag"
/obj/item/flag/command
name = "Command flag"
desc = "The flag of the independant, sovereign nation of Command."
icon_state = "ntflag"
//Antags
/obj/item/flag/grey
name = "Greytide flag"
desc = "A banner made from an old grey jumpsuit."
icon_state = "greyflag"
/obj/item/flag/syndi
name = "Syndicate flag"
desc = "A flag proudly boasting the logo of the Syndicate, in defiance of NT."
icon_state = "syndiflag"
/obj/item/flag/ninja
name = "Spider Clan flag"
desc = "A flag proudly boasting the logo of the Spider Clan, in defiance of NT."
icon_state = "ninjaflag"
/obj/item/flag/wiz
name = "Wizard Federation flag"
desc = "A flag proudly boasting the logo of the Wizard Federation, sworn enemies of NT."
icon_state = "wizflag"
/obj/item/flag/cult
name = "Nar'Sie Cultist flag"
desc = "A flag proudly boasting the logo of the cultists, sworn enemies of NT."
icon_state = "cultflag"
+2 -1
View File
@@ -12,7 +12,8 @@
attack(mob/M as mob, mob/living/silicon/robot/user as mob)
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been attacked with [src.name] by [user.name] ([user.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to attack [M.name] ([M.ckey])</font>")
msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(M.ckey)
msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(!iscarbon(user))
M.LAssailant = null
+17 -17
View File
@@ -78,15 +78,15 @@
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]." )
user.visible_message( "\blue [user] bandages \the [W.desc] on [M]'s [affecting.display_name].", \
"\blue You bandage \the [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]." )
user.visible_message( "\blue [user] places a bruise patch over \the [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place a bruise patch over \the [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]." )
user.visible_message( "\blue [user] places a bandaid over \the [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place a bandaid over \the [W.desc] on [M]'s [affecting.display_name]." )
use(1)
else
if (can_operate(H)) //Checks if mob is lying down on table for surgery
@@ -117,15 +117,15 @@
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]." )
user.visible_message( "\blue [user] salves the wounds on [M]'s [affecting.display_name].", \
"\blue You salve the wounds on [M]'s [affecting.display_name]." )
use(1)
else
if (can_operate(H)) //Checks if mob is lying down on table for surgery
if (do_surgery(H,user,src))
return
else
user << "<span class='notice'>The [affecting.display_name] is cut open, you'll need more than a bandage!</span>"
user << "<span class='notice'>The [affecting.display_name] is cut open, you'll need more than some ointment!</span>"
/obj/item/stack/medical/bruise_pack/tajaran
name = "\improper S'rendarr's Hand leaf"
@@ -168,15 +168,15 @@
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]." )
user.visible_message( "\blue [user] cleans \the [W.desc] on [M]'s [affecting.display_name] and seals the edges with bioglue.", \
"\blue You clean and seal \the [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]." )
user.visible_message( "\blue [user] places a medicine patch over \the [W.desc] on [M]'s [affecting.display_name].", \
"\blue You place a medicine patch over \the [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]." )
user.visible_message( "\blue [user] smears some bioglue over \the [W.desc] on [M]'s [affecting.display_name].", \
"\blue You smear some bioglue over \the [W.desc] on [M]'s [affecting.display_name]." )
affecting.heal_damage(heal_brute,0)
use(1)
else
@@ -208,8 +208,8 @@
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." )
user.visible_message( "\blue [user] covers the wounds on [M]'s [affecting.display_name] with regenerative membrane.", \
"\blue You cover the wounds on [M]'s [affecting.display_name] with regenerative membrane." )
affecting.heal_damage(0,heal_burn)
use(1)
else
+1 -1
View File
@@ -168,7 +168,7 @@
src = null //dont kill proc after del()
if(usr)
usr.before_take_item(oldsrc)
del(oldsrc)
qdel(oldsrc)
return
/obj/item/stack/proc/add_to_stacks(mob/usr as mob)
@@ -398,6 +398,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
item_state = icon_on
if(istype(src, /obj/item/weapon/lighter/zippo) )
user.visible_message("<span class='rose'>Without even breaking stride, [user] flips open and lights [src] in one smooth movement.</span>")
playsound(src.loc, 'sound/items/ZippoLight.ogg', 25, 1)
else
if(prob(75))
user.visible_message("<span class='notice'>After a few attempts, [user] manages to light the [src].</span>")
@@ -414,6 +415,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
item_state = icon_off
if(istype(src, /obj/item/weapon/lighter/zippo) )
user.visible_message("<span class='rose'>You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing. Wow.")
playsound(src.loc, 'sound/items/ZippoClose.ogg', 25, 1)
else
user.visible_message("<span class='notice'>[user] quietly shuts off the [src].")
@@ -69,7 +69,8 @@
user << "Planting explosives..."
if(ismob(target))
user.attack_log += "\[[time_stamp()]\] <font color='red'> [user.real_name] tried planting [name] on [target:real_name] ([target:ckey])</font>"
msg_admin_attack("[user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(target:ckey)
msg_admin_attack("[user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
user.visible_message("\red [user.name] is trying to plant some kind of explosive on [target.name]!")
@@ -146,8 +146,12 @@
if(usr.buckled && isobj(usr.buckled) && !usr.buckled.anchored )
spawn(0)
var/obj/structure/stool/bed/chair/C = null
if(istype(usr.buckled, /obj/structure/stool/bed/chair))
C = usr.buckled
var/obj/B = usr.buckled
var/movementdirection = turn(direction,180)
if(C) C.propelled = 1
B.Move(get_step(usr,movementdirection), movementdirection)
sleep(1)
B.Move(get_step(usr,movementdirection), movementdirection)
@@ -159,6 +163,7 @@
B.Move(get_step(usr,movementdirection), movementdirection)
sleep(2)
B.Move(get_step(usr,movementdirection), movementdirection)
if(C) C.propelled = 0
sleep(3)
B.Move(get_step(usr,movementdirection), movementdirection)
sleep(3)
@@ -116,7 +116,7 @@ Implant Specifics:<BR>"}
activate(var/cause)
if((!cause) || (!src.imp_in)) return 0
explosion(src, -1, 0, 2, 3, 0)//This might be a bit much, dono will have to see.
explosion(src, 0, 1, 3, 6)//This might be a bit much, dono will have to see.
if(src.imp_in)
src.imp_in.gib()
@@ -91,8 +91,18 @@
..()
return
/obj/item/weapon/implantcase/dexplosive
name = "Glass Case- 'Death Explosive'"
desc = "A case containing an explosive implant."
icon = 'icons/obj/items.dmi'
icon_state = "implantcase-r"
New()
src.imp = new /obj/item/weapon/implant/dexplosive( src )
..()
return
/obj/item/weapon/implantcase/chem
name = "Glass Case- 'Chem'"
desc = "A case containing a chemical implant."
@@ -72,7 +72,14 @@
update()
return
/obj/item/weapon/implanter/dexplosive
name = "implanter (DE)"
/obj/item/weapon/implanter/dexplosive/New()
src.imp = new /obj/item/weapon/implant/dexplosive( src )
..()
update()
return
/obj/item/weapon/implanter/explosive
name = "implanter (E)"
@@ -14,6 +14,7 @@
activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate.", 0, 0)
source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, <B>say *[src.activation_emote]</B> to attempt to activate."
hidden_uplink.uplink_owner="[source]"
return 1

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