mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 00:23:29 +01:00
Recommits storage
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>)")
|
||||
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
*/
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////
|
||||
@@ -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
|
||||
|
||||
@@ -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--
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
@@ -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))
|
||||
..()
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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++
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]"
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user