mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-10 06:34:45 +01:00
Merge remote-tracking branch 'upstream/master' into job_refactor_tg
This commit is contained in:
@@ -2,7 +2,8 @@
|
||||
var/list/admin_verbs_default = list(
|
||||
/client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/
|
||||
/client/proc/hide_verbs, /*hides all our adminverbs*/
|
||||
/client/proc/cmd_mentor_check_new_players
|
||||
/client/proc/cmd_mentor_check_new_players,
|
||||
/client/proc/cmd_mentor_check_player_exp /* shows players by playtime */
|
||||
)
|
||||
var/list/admin_verbs_admin = list(
|
||||
/client/proc/check_antagonists, /*shows all antags*/
|
||||
@@ -75,8 +76,8 @@ var/list/admin_verbs_admin = list(
|
||||
/client/proc/debug_variables,
|
||||
/client/proc/show_snpc_verbs,
|
||||
/client/proc/reset_all_tcs, /*resets all telecomms scripts*/
|
||||
/client/proc/cmd_admin_check_player_exp, /* shows players by playtime */
|
||||
/client/proc/toggle_mentor_chat
|
||||
/client/proc/toggle_mentor_chat,
|
||||
/client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/
|
||||
)
|
||||
var/list/admin_verbs_ban = list(
|
||||
/client/proc/unban_panel,
|
||||
@@ -970,20 +971,33 @@ var/list/admin_verbs_snpc = list(
|
||||
set name = "Show SNPC Verbs"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder)
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
verbs += admin_verbs_snpc
|
||||
verbs -= /client/proc/show_snpc_verbs
|
||||
to_chat(src, "<span class='interface'>SNPC verbs on.</span>")
|
||||
to_chat(src, "<span class='interface'>SNPC verbs have been toggled on.</span>")
|
||||
|
||||
/client/proc/hide_snpc_verbs()
|
||||
set name = "Hide SNPC Verbs"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder)
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
verbs -= admin_verbs_snpc
|
||||
verbs += /client/proc/show_snpc_verbs
|
||||
to_chat(src, "<span class='interface'>SNPC verbs off.</span>")
|
||||
to_chat(src, "<span class='interface'>SNPC verbs have been toggled off.</span>")
|
||||
|
||||
/client/proc/toggle_advanced_interaction()
|
||||
set name = "Toggle Advanced Admin Interaction"
|
||||
set category = "Admin"
|
||||
set desc = "Allows you to interact with atoms such as buttons and doors, on top of regular machinery interaction."
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
advanced_admin_interaction = !advanced_admin_interaction
|
||||
|
||||
log_admin("[key_name(usr)] has [advanced_admin_interaction ? "activated" : "deactivated"] their advanced admin interaction.")
|
||||
message_admins("[key_name_admin(usr)] has [advanced_admin_interaction ? "activated" : "deactivated"] their advanced admin interaction.")
|
||||
|
||||
@@ -1533,6 +1533,23 @@
|
||||
else if(href_list["check_antagonist"])
|
||||
check_antagonists()
|
||||
|
||||
else if(href_list["take_question"])
|
||||
var/mob/M = locateUID(href_list["take_question"])
|
||||
var/is_mhelp = href_list["is_mhelp"]
|
||||
if(ismob(M))
|
||||
var/helptype = "ADMINHELP"
|
||||
if(is_mhelp)
|
||||
helptype = "MENTORHELP"
|
||||
var/take_msg = "<span class='notice'><b>[helptype]</b>: <b>[key_name(usr.client)]</b> is attending to <b>[key_name(M)]'s</b> question.</span>"
|
||||
for(var/client/X in admins)
|
||||
if(check_rights(R_ADMIN, 0, X.mob))
|
||||
to_chat(X, take_msg)
|
||||
else if(is_mhelp && check_rights(R_MOD|R_MENTOR, 0, X.mob))
|
||||
to_chat(X, take_msg)
|
||||
to_chat(M, "<span class='notice'><b>Your question is being attended to by [key_name(usr.client)]. Thanks for your patience!</b></span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Unable to locate mob.</span>")
|
||||
|
||||
else if(href_list["cult_nextobj"])
|
||||
if(alert(usr, "Validate the current Cult objective and unlock the next one?", "Cult Cheat Code", "Yes", "No") != "Yes")
|
||||
return
|
||||
@@ -1724,33 +1741,42 @@
|
||||
btypes += "Heal Over Time"
|
||||
btypes += "Permanent Regeneration"
|
||||
btypes += "Super Powers"
|
||||
var/blessing = input(src.owner, "How would you like to bless [M]?", "Its good to be good...", "") as null|anything in btypes
|
||||
var/blessing = input(owner, "How would you like to bless [M]?", "Its good to be good...", "") as null|anything in btypes
|
||||
if(!(blessing in btypes))
|
||||
return
|
||||
var/logmsg = null
|
||||
switch(blessing)
|
||||
if("To Arrivals")
|
||||
M.forceMove(pick(latejoin))
|
||||
to_chat(M, "<span class='userdanger'>You are abruptly pulled through space!</span>")
|
||||
logmsg = "a teleport to arrivals."
|
||||
if("Moderate Heal")
|
||||
M.adjustBruteLoss(-25)
|
||||
M.adjustFireLoss(-25)
|
||||
M.adjustToxLoss(-25)
|
||||
M.adjustOxyLoss(-25)
|
||||
to_chat(M,"<span class='userdanger'>You feel invigorated!</span>")
|
||||
logmsg = "a moderate heal."
|
||||
if("Heal Over Time")
|
||||
H.reagents.add_reagent("salglu_solution", 30)
|
||||
H.reagents.add_reagent("salbutamol", 20)
|
||||
H.reagents.add_reagent("spaceacillin", 20)
|
||||
logmsg = "a heal over time."
|
||||
if("Permanent Regeneration")
|
||||
H.dna.SetSEState(REGENERATEBLOCK, 1)
|
||||
genemutcheck(H, REGENERATEBLOCK, null, MUTCHK_FORCED)
|
||||
H.update_mutations()
|
||||
logmsg = "permanent regeneration."
|
||||
if("Super Powers")
|
||||
var/list/default_genes = list(REGENERATEBLOCK, NOBREATHBLOCK, COLDBLOCK)
|
||||
for(var/gene in default_genes)
|
||||
H.dna.SetSEState(gene, 1)
|
||||
genemutcheck(H, gene, null, MUTCHK_FORCED)
|
||||
H.update_mutations()
|
||||
logmsg = "superpowers."
|
||||
if(logmsg)
|
||||
log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a blessing: [logmsg]")
|
||||
message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a blessing: [logmsg]")
|
||||
else if(href_list["Smite"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
@@ -1767,9 +1793,10 @@
|
||||
ptypes += "Cluwne"
|
||||
ptypes += "Mutagen Cookie"
|
||||
ptypes += "Hellwater Cookie"
|
||||
var/punishment = input(src.owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes
|
||||
var/punishment = input(owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes
|
||||
if(!(punishment in ptypes))
|
||||
return
|
||||
var/logmsg = null
|
||||
switch(punishment)
|
||||
if("Lightning bolt")
|
||||
M.electrocute_act(5, "Lightning Bolt", safety=1)
|
||||
@@ -1777,20 +1804,25 @@
|
||||
M.adjustFireLoss(75)
|
||||
M.Weaken(5)
|
||||
to_chat(M, "<span class='userdanger'>The gods have punished you for your sins!</span>")
|
||||
logmsg = "a lightning bolt."
|
||||
if("Brain Damage")
|
||||
H.adjustBrainLoss(75)
|
||||
logmsg = "75 brain damage."
|
||||
if("Fire Death")
|
||||
to_chat(M,"<span class='userdanger'>You feel hotter than usual. Maybe you should lowe-wait, is that your hand melting?</span>")
|
||||
var/turf/simulated/T = get_turf(M)
|
||||
new /obj/effect/hotspot(T)
|
||||
M.adjustFireLoss(150)
|
||||
logmsg = "a firey death."
|
||||
if("Honk Tumor")
|
||||
if(!H.get_int_organ(/obj/item/organ/internal/honktumor))
|
||||
var/obj/item/organ/internal/organ = new /obj/item/organ/internal/honktumor
|
||||
to_chat(H, "<span class='userdanger'>Life seems funnier, somehow.</span>")
|
||||
organ.insert(H)
|
||||
logmsg = "a honk tumor."
|
||||
if("Cluwne")
|
||||
H.makeCluwne()
|
||||
logmsg = "cluwned."
|
||||
if("Mutagen Cookie")
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/cookie/evilcookie = new /obj/item/weapon/reagent_containers/food/snacks/cookie
|
||||
evilcookie.reagents.add_reagent("mutagen", 10)
|
||||
@@ -1798,6 +1830,7 @@
|
||||
evilcookie.bitesize = 100
|
||||
H.drop_l_hand()
|
||||
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
|
||||
logmsg = "a mutagen cookie."
|
||||
if("Hellwater Cookie")
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/cookie/evilcookie = new /obj/item/weapon/reagent_containers/food/snacks/cookie
|
||||
evilcookie.reagents.add_reagent("hell_water", 25)
|
||||
@@ -1805,8 +1838,13 @@
|
||||
evilcookie.bitesize = 100
|
||||
H.drop_l_hand()
|
||||
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
|
||||
logmsg = "a hellwater cookie."
|
||||
if("Gib")
|
||||
logmsg = "gibbed."
|
||||
M.gib(FALSE)
|
||||
if(logmsg)
|
||||
log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a smiting: [logmsg]")
|
||||
message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a smiting: [logmsg]")
|
||||
else if(href_list["FaxReplyTemplate"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
@@ -2128,7 +2166,7 @@
|
||||
if(!M)
|
||||
to_chat(usr, "ERROR: Mob not found.")
|
||||
return
|
||||
cmd_show_exp_panel(M.client)
|
||||
cmd_mentor_show_exp_panel(M.client)
|
||||
|
||||
else if(href_list["jumpto"])
|
||||
if(!check_rights(R_ADMIN)) return
|
||||
@@ -3115,7 +3153,7 @@
|
||||
error_viewer.showTo(usr, locate(href_list["viewruntime_backto"]), href_list["viewruntime_linear"])
|
||||
else
|
||||
error_viewer.showTo(usr, null, href_list["viewruntime_linear"])
|
||||
|
||||
|
||||
else if(href_list["add_station_goal"])
|
||||
if(!check_rights(R_EVENT))
|
||||
return
|
||||
|
||||
@@ -109,13 +109,13 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
|
||||
switch(selected_type)
|
||||
if("Mentorhelp")
|
||||
msg = "<span class='mentorhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""]:</span> <span class='mentorhelp'>[msg]</span>"
|
||||
msg = "<span class='mentorhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""] (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=holder;take_question=[mob.UID()];is_mhelp=1'>TAKE</A>) :</span> <span class='mentorhelp'>[msg]</span>"
|
||||
for(var/client/X in mentorholders + modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
to_chat(X, msg)
|
||||
if("Adminhelp")
|
||||
msg = "<span class='adminhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""]:</span> <span class='adminhelp'>[msg]</span>"
|
||||
msg = "<span class='adminhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""] (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=holder;take_question=[mob.UID()]'>TAKE</A>) :</span> <span class='adminhelp'>[msg]</span>"
|
||||
for(var/client/X in modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
|
||||
@@ -10,11 +10,11 @@
|
||||
var/input = input(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", custom_event_msg) as message|null
|
||||
if(!input || input == "")
|
||||
custom_event_msg = null
|
||||
log_admin("[usr.key] has cleared the custom event text.")
|
||||
log_admin("[key_name(usr)] has cleared the custom event text.")
|
||||
message_admins("[key_name_admin(usr)] has cleared the custom event text.")
|
||||
return
|
||||
|
||||
log_admin("[usr.key] has changed the custom event text.")
|
||||
log_admin("[key_name(usr)] has changed the custom event text.")
|
||||
message_admins("[key_name_admin(usr)] has changed the custom event text.")
|
||||
|
||||
custom_event_msg = input
|
||||
|
||||
@@ -88,7 +88,10 @@
|
||||
missing_ages = 1
|
||||
continue
|
||||
if(C.player_age < age)
|
||||
msg += "[key_name_admin(C)]: account is [C.player_age] days old<br>"
|
||||
if(check_rights(R_ADMIN))
|
||||
msg += "[key_name_admin(C.mob)]: [C.player_age] days old<br>"
|
||||
else
|
||||
msg += "[key_name_mentor(C.mob)]: [C.player_age] days old<br>"
|
||||
|
||||
if(missing_ages)
|
||||
to_chat(src, "Some accounts did not have proper ages set in their clients. This function requires database to be present")
|
||||
@@ -907,6 +910,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
holder.modify_goals()
|
||||
|
||||
/datum/admins/proc/modify_goals()
|
||||
if(!ticker || !ticker.mode)
|
||||
to_chat(usr, "<span class='warning'>This verb can only be used if the round has started.</span>")
|
||||
return
|
||||
|
||||
var/dat = ""
|
||||
for(var/datum/station_goal/S in ticker.mode.station_goals)
|
||||
dat += "[S.name] - <a href='?src=[S.UID()];announce=1'>Announce</a> | <a href='?src=[S.UID()];remove=1'>Remove</a><br>"
|
||||
|
||||
@@ -93,5 +93,9 @@
|
||||
|
||||
// Donator stuff.
|
||||
var/donator_level = DONATOR_LEVEL_NONE
|
||||
|
||||
// If set to true, this client can interact with atoms such as buttons and doors on top of regular machinery interaction
|
||||
var/advanced_admin_interaction = FALSE
|
||||
|
||||
// Has the client been varedited by an admin?
|
||||
var/var_edited = FALSE
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
var/toggle_message = null
|
||||
var/alt_toggle_message = null
|
||||
var/active_sound = null
|
||||
var/toggle_sound = null
|
||||
var/toggle_cooldown = null
|
||||
var/cooldown = 0
|
||||
var/species_disguise = null
|
||||
@@ -566,7 +567,7 @@ BLIND // can't see anything
|
||||
permeability_coefficient = 0.90
|
||||
slot_flags = SLOT_ICLOTHING
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Drask")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/uniform.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/uniform.dmi'
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
|
||||
strip_delay = 60
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Drask")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/helmet.dmi'
|
||||
@@ -34,6 +34,8 @@
|
||||
while(up)
|
||||
playsound(src.loc, "[active_sound]", 100, 0, 4)
|
||||
sleep(15)
|
||||
if(toggle_sound)
|
||||
playsound(src.loc, "[toggle_sound]", 100, 0, 4)
|
||||
|
||||
|
||||
/obj/item/clothing/head/helmet/visor
|
||||
@@ -71,11 +73,6 @@
|
||||
icon_state = "swat"
|
||||
item_state = "swat-alt"
|
||||
armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/riot
|
||||
name = "riot helmet"
|
||||
@@ -127,11 +124,6 @@
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
|
||||
strip_delay = 80
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/swat/syndicate
|
||||
name = "blood-red helmet"
|
||||
@@ -174,6 +166,12 @@
|
||||
flags = HEADCOVERSEYES | BLOCKHAIR
|
||||
item_state = "gladiator"
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
|
||||
toggle_message = "You attach the face shield to the"
|
||||
alt_toggle_message = "You remove the face shield from the"
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet_mode)
|
||||
can_toggle = 1
|
||||
toggle_cooldown = 20
|
||||
toggle_sound = 'sound/items/ZippoClose.ogg'
|
||||
|
||||
obj/item/clothing/head/helmet/redtaghelm
|
||||
name = "red laser tag helmet"
|
||||
@@ -202,6 +200,10 @@ obj/item/clothing/head/blob
|
||||
item_state = "blobhat"
|
||||
flags = HEADCOVERSEYES|HEADCOVERSMOUTH
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/riot/knight/blue
|
||||
icon_state = "knight_blue"
|
||||
|
||||
@@ -31,17 +31,25 @@
|
||||
|
||||
//Unathi space gear. Huge and restrictive.
|
||||
/obj/item/clothing/head/helmet/space/unathi
|
||||
icon = 'icons/obj/clothing/species/unathi/hats.dmi'
|
||||
species_restricted = list("Unathi")
|
||||
sprite_sheets = list(
|
||||
"Unathi" = 'icons/mob/species/unathi/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/unathi/helmet_cheap
|
||||
name = "NT breacher helmet"
|
||||
desc = "Hey! Watch it with that thing! It's a knock-off of a Unathi battle-helm, and that spike could put someone's eye out."
|
||||
desc = "Hey! Watch it with that thing! It's a knock-off of an Unathi battle-helm, and that spike could put someone's eye out."
|
||||
icon_state = "unathi_helm_cheap"
|
||||
item_state = "unathi_helm_cheap"
|
||||
item_color = "unathi_helm_cheap"
|
||||
|
||||
/obj/item/clothing/suit/space/unathi
|
||||
icon = 'icons/obj/clothing/species/unathi/suits.dmi'
|
||||
species_restricted = list("Unathi")
|
||||
sprite_sheets = list(
|
||||
"Unathi" = 'icons/mob/species/unathi/suit.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/space/unathi/rig_cheap
|
||||
name = "NT breacher chassis"
|
||||
@@ -71,6 +79,7 @@
|
||||
armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
icon = 'icons/obj/clothing/species/vox/suits.dmi'
|
||||
species_restricted = list("Vox", "Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi',
|
||||
@@ -80,6 +89,7 @@
|
||||
/obj/item/clothing/head/helmet/space/vox
|
||||
armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
flags = HEADCOVERSEYES|STOPSPRESSUREDMAGE
|
||||
icon = 'icons/obj/clothing/species/vox/hats.dmi'
|
||||
species_restricted = list("Vox","Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi',
|
||||
@@ -137,6 +147,7 @@
|
||||
|
||||
/obj/item/clothing/under/vox
|
||||
has_sensor = 0
|
||||
icon = 'icons/obj/clothing/species/vox/uniforms.dmi'
|
||||
species_restricted = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/uniform.dmi'
|
||||
@@ -150,12 +161,17 @@
|
||||
item_state = "vox-casual-1"
|
||||
body_parts_covered = LEGS
|
||||
|
||||
/obj/item/clothing/under/vox/vox_robes
|
||||
/obj/item/clothing/under/vox/vox_robes //This will be invisible on Armalis for lack of a proper sprite. They wear a carapace suit anyway, and this is more just to let them use IDs and such.
|
||||
name = "alien robes"
|
||||
desc = "Weird and flowing!"
|
||||
icon_state = "vox-casual-2"
|
||||
item_color = "vox-casual-2"
|
||||
item_state = "vox-casual-2"
|
||||
species_restricted = list("Vox","Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/uniform.dmi',
|
||||
"Vox Armalis" = 'icons/mob/species/armalis/suit.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/vox
|
||||
desc = "These bizarre gauntlets seem to be fitted for... bird claws?"
|
||||
@@ -165,20 +181,22 @@
|
||||
siemens_coefficient = 0
|
||||
permeability_coefficient = 0.05
|
||||
item_color = "gloves-vox"
|
||||
icon = 'icons/obj/clothing/species/vox/gloves.dmi'
|
||||
species_restricted = list("Vox","Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/gloves.dmi',
|
||||
"Vox Armalis" = 'icons/mob/species/armalis/gloves.dmi',
|
||||
)
|
||||
/obj/item/clothing/shoes/magboots/vox
|
||||
|
||||
/obj/item/clothing/shoes/magboots/vox
|
||||
desc = "A pair of heavy, jagged armoured foot pieces, seemingly suitable for a velociraptor."
|
||||
name = "vox magclaws"
|
||||
item_state = "boots-vox"
|
||||
icon_state = "boots-vox"
|
||||
|
||||
icon = 'icons/obj/clothing/species/vox/shoes.dmi'
|
||||
species_restricted = list("Vox","Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/feet.dmi',
|
||||
"Vox Armalis" = 'icons/mob/species/armalis/feet.dmi'
|
||||
)
|
||||
|
||||
@@ -223,6 +241,7 @@
|
||||
name = "Vox EVA Suit"
|
||||
icon_state = "voxspace"
|
||||
item_state = "voxspace"
|
||||
icon = 'icons/obj/clothing/species/vox/suits.dmi'
|
||||
species_restricted = list("Vox", "Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi',
|
||||
@@ -233,6 +252,7 @@
|
||||
name = "Vox EVA Suit"
|
||||
icon_state = "voxspace"
|
||||
item_state = "voxspace"
|
||||
icon = 'icons/obj/clothing/species/vox/hats.dmi'
|
||||
species_restricted = list("Vox","Vox Armalis")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi',
|
||||
|
||||
@@ -10,9 +10,12 @@
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
|
||||
flags_inv = HIDEGLOVES|HIDESHOES
|
||||
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
|
||||
icon = 'icons/obj/clothing/species/plasmaman/suits.dmi'
|
||||
species_restricted = list("Plasmaman")
|
||||
sprite_sheets = list(
|
||||
"Plasmaman" = 'icons/mob/species/plasmaman/suit.dmi'
|
||||
)
|
||||
flags = STOPSPRESSUREDMAGE
|
||||
|
||||
icon_state = "plasmaman_suit"
|
||||
item_state = "plasmaman_suit"
|
||||
|
||||
@@ -39,8 +42,11 @@
|
||||
name = "plasmaman helmet"
|
||||
desc = "A special containment helmet designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
|
||||
flags = STOPSPRESSUREDMAGE
|
||||
icon = 'icons/obj/clothing/species/plasmaman/hats.dmi'
|
||||
species_restricted = list("Plasmaman")
|
||||
|
||||
sprite_sheets = list(
|
||||
"Plasmaman" = 'icons/mob/species/plasmaman/helmet.dmi'
|
||||
)
|
||||
icon_state = "plasmaman_helmet0"
|
||||
item_state = "plasmaman_helmet0"
|
||||
var/base_state = "plasmaman_helmet"
|
||||
|
||||
@@ -10,8 +10,9 @@
|
||||
vision_restriction = 1
|
||||
offline_vision_restriction = 2
|
||||
|
||||
chest_type = /obj/item/clothing/suit/space/new_rig
|
||||
chest_type = /obj/item/clothing/suit/space/new_rig/unathi
|
||||
helm_type = /obj/item/clothing/head/helmet/space/new_rig/unathi
|
||||
glove_type = /obj/item/clothing/gloves/rig/unathi
|
||||
boot_type = /obj/item/clothing/shoes/magboots/rig/unathi
|
||||
|
||||
/obj/item/weapon/rig/unathi/fancy
|
||||
@@ -23,10 +24,23 @@
|
||||
vision_restriction = 0
|
||||
|
||||
/obj/item/clothing/head/helmet/space/new_rig/unathi
|
||||
icon = 'icons/obj/clothing/species/unathi/hats.dmi'
|
||||
species_restricted = list("Unathi")
|
||||
|
||||
/obj/item/clothing/suit/space/new_rig/unathi
|
||||
icon = 'icons/obj/clothing/species/unathi/suits.dmi'
|
||||
species_restricted = list("Unathi")
|
||||
|
||||
/obj/item/clothing/gloves/rig/unathi
|
||||
icon = 'icons/obj/clothing/species/unathi/gloves.dmi'
|
||||
species_restricted = list("Unathi")
|
||||
sprite_sheets = list(
|
||||
"Unathi" = 'icons/mob/species/unathi/gloves.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/shoes/magboots/rig/unathi
|
||||
species_restricted = list("Unathi")
|
||||
icon = 'icons/obj/clothing/species/unathi/shoes.dmi'
|
||||
species_restricted = list("Unathi")
|
||||
sprite_sheets = list(
|
||||
"Unathi" = 'icons/mob/species/unathi/feet.dmi'
|
||||
)
|
||||
@@ -565,35 +565,43 @@
|
||||
item_state = "bane"
|
||||
item_color = "bane"
|
||||
|
||||
/obj/item/clothing/under/vox_grey
|
||||
/obj/item/clothing/under/vox
|
||||
name = "Ripped Jumpsuit"
|
||||
desc = "A jumpsuit that looks like it's been shredded by some talons. Who could wear this now?"
|
||||
icon = 'icons/obj/clothing/species/vox/uniforms.dmi'
|
||||
icon_state = "vgrey"
|
||||
item_state = "vgrey"
|
||||
item_color = "vgrey"
|
||||
|
||||
/obj/item/clothing/under/vox/grey
|
||||
name = "Grey Vox Jumpsuit"
|
||||
desc = "An assistant's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vgrey"
|
||||
item_state = "vgrey"
|
||||
item_color = "vgrey"
|
||||
|
||||
/obj/item/clothing/under/vox_robotics
|
||||
/obj/item/clothing/under/vox/robotics
|
||||
name = "Vox Robotics Jumpsuit"
|
||||
desc = "A roboticist's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vrobotics"
|
||||
item_state = "vrobotics"
|
||||
item_color = "vrobotics"
|
||||
|
||||
/obj/item/clothing/under/vox_toxins
|
||||
/obj/item/clothing/under/vox/toxins
|
||||
name = "Vox Toxins Jumpsuit"
|
||||
desc = "A Toxin Researcher's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vtoxinswhite"
|
||||
item_state = "vtoxinswhite"
|
||||
item_color = "vtoxinswhite"
|
||||
|
||||
/obj/item/clothing/under/vox_atmos
|
||||
/obj/item/clothing/under/vox/atmos
|
||||
name = "Vox Atmos Jumpsuit"
|
||||
desc = "An Atmos Tech's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vatmos"
|
||||
item_state = "vatmos"
|
||||
item_color = "vatmos"
|
||||
|
||||
/obj/item/clothing/under/vox_engi
|
||||
/obj/item/clothing/under/vox/engi
|
||||
name = "Vox Engineer Jumpsuit"
|
||||
desc = "An Engineer's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vengine"
|
||||
@@ -601,7 +609,7 @@
|
||||
item_color = "vengine"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
|
||||
|
||||
/obj/item/clothing/under/vox_sec
|
||||
/obj/item/clothing/under/vox/sec
|
||||
name = "Vox Security Jumpsuit"
|
||||
desc = "A Security officer's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vred"
|
||||
@@ -609,7 +617,7 @@
|
||||
item_color = "vred"
|
||||
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
|
||||
/obj/item/clothing/under/vox_chem
|
||||
/obj/item/clothing/under/vox/chem
|
||||
name = "Vox Chemist Jumpsuit"
|
||||
desc = "A Chemist's jumpsuit ripped to better fit a vox."
|
||||
icon_state = "vchem"
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
/obj/item/device/eftpos/proc/print_reference()
|
||||
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
|
||||
var/obj/item/weapon/paper/R = new(src.loc)
|
||||
var/obj/item/weapon/paper/R = new(loc)
|
||||
R.name = "Reference: [eftpos_name]"
|
||||
|
||||
// AUTOFIXED BY fix_string_idiocy.py
|
||||
@@ -45,7 +45,7 @@
|
||||
R.overlays += stampoverlay
|
||||
R.stamps += "<HR><i>This paper has been stamped by the EFTPOS device.</i>"
|
||||
var/obj/item/smallDelivery/D = new(R.loc)
|
||||
R.loc = D
|
||||
R.forceMove(D)
|
||||
D.wrapped = R
|
||||
D.name = "small parcel - 'EFTPOS access code'"
|
||||
|
||||
@@ -54,70 +54,51 @@
|
||||
if(!location)
|
||||
return
|
||||
|
||||
for(var/obj/machinery/computer/account_database/DB in world) //Hotfix until someone finds out why it isn't in 'machines'
|
||||
for(var/obj/machinery/computer/account_database/DB in machines)
|
||||
if(DB.z == location.z)
|
||||
linked_db = DB
|
||||
break
|
||||
|
||||
/obj/item/device/eftpos/attack_self(mob/user as mob)
|
||||
if(get_dist(src,user) <= 1)
|
||||
/obj/item/device/eftpos/attack_self(mob/user)
|
||||
ui_interact(user)
|
||||
|
||||
// AUTOFIXED BY fix_string_idiocy.py
|
||||
// C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:59: var/dat = "<b>[eftpos_name]</b><br>"
|
||||
var/dat = {"<b>[eftpos_name]</b><br>
|
||||
<i>This terminal is</i> [machine_id]. <i>Report this code when contacting Nanotrasen IT Support</i><br>"}
|
||||
// END AUTOFIX
|
||||
if(transaction_locked)
|
||||
|
||||
// AUTOFIXED BY fix_string_idiocy.py
|
||||
// C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:59: dat += "<a href='?src=[UID()];choice=toggle_lock'>Reset[transaction_paid ? "" : " (authentication required)"]</a><br><br>"
|
||||
dat += {"<a href='?src=[UID()];choice=toggle_lock'>Reset[transaction_paid ? "" : " (authentication required)"]</a><br><br>
|
||||
Transaction purpose: <b>[transaction_purpose]</b><br>
|
||||
Value: <b>$[transaction_amount]</b><br>
|
||||
Linked account: <b>[linked_account ? linked_account.owner_name : "None"]</b><hr>"}
|
||||
// END AUTOFIX
|
||||
if(transaction_paid)
|
||||
dat += "<i>This transaction has been processed successfully.</i><hr>"
|
||||
else
|
||||
|
||||
// AUTOFIXED BY fix_string_idiocy.py
|
||||
// C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:67: dat += "<i>Swipe your card below the line to finish this transaction.</i><hr>"
|
||||
dat += {"<i>Swipe your card below the line to finish this transaction.</i><hr>
|
||||
<a href='?src=[UID()];choice=scan_card'>\[------\]</a>"}
|
||||
// END AUTOFIX
|
||||
else
|
||||
|
||||
// AUTOFIXED BY fix_string_idiocy.py
|
||||
// C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:70: dat += "<a href='?src=[UID()];choice=toggle_lock'>Lock in new transaction</a><br><br>"
|
||||
dat += {"<a href='?src=[UID()];choice=toggle_lock'>Lock in new transaction</a><br><br>
|
||||
Transaction purpose: <a href='?src=[UID()];choice=trans_purpose'>[transaction_purpose]</a><br>
|
||||
Value: <a href='?src=[UID()];choice=trans_value'>$[transaction_amount]</a><br>
|
||||
Linked account: <a href='?src=[UID()];choice=link_account'>[linked_account ? linked_account.owner_name : "None"]</a><hr>
|
||||
<a href='?src=[UID()];choice=change_code'>Change access code</a><br>
|
||||
<a href='?src=[UID()];choice=change_id'>Change EFTPOS ID</a><br>
|
||||
Scan card to reset access code <a href='?src=[UID()];choice=reset'>\[------\]</a>"}
|
||||
// END AUTOFIX
|
||||
user << browse(dat,"window=eftpos")
|
||||
else
|
||||
user << browse(null,"window=eftpos")
|
||||
|
||||
/obj/item/device/eftpos/attackby(O as obj, user as mob, params)
|
||||
/obj/item/device/eftpos/attackby(obj/O, mob/user, params)
|
||||
if(istype(O, /obj/item/weapon/card))
|
||||
//attempt to connect to a new db, and if that doesn't work then fail
|
||||
if(!linked_db)
|
||||
reconnect_database()
|
||||
if(linked_db)
|
||||
if(linked_account)
|
||||
var/obj/item/weapon/card/I = O
|
||||
scan_card(I)
|
||||
scan_card(O, user)
|
||||
nanomanager.update_uis(src)
|
||||
else
|
||||
to_chat(usr, "[bicon(src)]<span class='warning'>Unable to connect to linked account.</span>")
|
||||
to_chat(user, "[bicon(src)]<span class='warning'>Unable to connect to linked account.</span>")
|
||||
else
|
||||
to_chat(usr, "[bicon(src)]<span class='warning'>Unable to connect to accounts database.</span>")
|
||||
to_chat(user, "[bicon(src)]<span class='warning'>Unable to connect to accounts database.</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/device/eftpos/Topic(var/href, var/href_list)
|
||||
/obj/item/device/eftpos/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "eftpos.tmpl", name, 790, 310)
|
||||
ui.open()
|
||||
|
||||
/obj/item/device/eftpos/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
|
||||
var/data[0]
|
||||
data["eftpos_name"] = eftpos_name
|
||||
data["machine_id"] = machine_id
|
||||
data["transaction_locked"] = transaction_locked
|
||||
data["transaction_paid"] = transaction_paid
|
||||
data["transaction_purpose"] = transaction_purpose
|
||||
data["transaction_amount"] = transaction_amount
|
||||
data["linked_account"] = linked_account ? linked_account.owner_name : null
|
||||
return data
|
||||
|
||||
/obj/item/device/eftpos/Topic(href, list/href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if(href_list["choice"])
|
||||
switch(href_list["choice"])
|
||||
if("change_code")
|
||||
@@ -134,9 +115,9 @@
|
||||
if("change_id")
|
||||
var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code"))
|
||||
if(attempt_code == access_code)
|
||||
var name = input("Enter a new terminal ID for this device", "Enter new EFTPOS ID") as text|null
|
||||
var/name = input("Enter a new terminal ID for this device", "Enter new EFTPOS ID") as text|null
|
||||
if(name)
|
||||
eftpos_name = name + " EFTPOS scanner"
|
||||
eftpos_name = "[name] EFTPOS scanner"
|
||||
print_reference()
|
||||
else
|
||||
to_chat(usr, "[bicon(src)]<span class='warning'>Incorrect code entered.</span>")
|
||||
@@ -150,11 +131,11 @@
|
||||
else
|
||||
to_chat(usr, "[bicon(src)]<span class='warning'>Unable to connect to accounts database.</span>")
|
||||
if("trans_purpose")
|
||||
var/purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose") as text|null
|
||||
var/purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose", transaction_purpose) as text|null
|
||||
if(purpose)
|
||||
transaction_purpose = purpose
|
||||
if("trans_value")
|
||||
var/try_num = input("Enter amount for EFTPOS transaction", "Transaction amount") as num
|
||||
var/try_num = input("Enter amount for EFTPOS transaction", "Transaction amount", transaction_amount) as num
|
||||
if(try_num < 0)
|
||||
alert("That is not a valid amount!")
|
||||
else
|
||||
@@ -168,7 +149,7 @@
|
||||
else if(linked_account)
|
||||
transaction_locked = 1
|
||||
else
|
||||
to_chat(usr, "[bicon(src)] <span class='warning'>No account connected to send transactions to.</span>")
|
||||
to_chat(usr, "[bicon(src)]<span class='warning'>No account connected to send transactions to.</span>")
|
||||
if("scan_card")
|
||||
//attempt to connect to a new db, and if that doesn't work then fail
|
||||
if(!linked_db)
|
||||
@@ -176,7 +157,7 @@
|
||||
if(linked_db && linked_account)
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if(istype(I, /obj/item/weapon/card))
|
||||
scan_card(I)
|
||||
scan_card(I, usr)
|
||||
else
|
||||
to_chat(usr, "[bicon(src)]<span class='warning'>Unable to link accounts.</span>")
|
||||
if("reset")
|
||||
@@ -191,12 +172,13 @@
|
||||
access_code = 0
|
||||
to_chat(usr, "[bicon(src)]<span class='info'>Access code reset to 0.</span>")
|
||||
|
||||
src.attack_self(usr)
|
||||
nanomanager.update_uis(src)
|
||||
return 1
|
||||
|
||||
/obj/item/device/eftpos/proc/scan_card(var/obj/item/weapon/card/I)
|
||||
/obj/item/device/eftpos/proc/scan_card(obj/item/weapon/card/I, mob/user)
|
||||
if(istype(I, /obj/item/weapon/card/id))
|
||||
var/obj/item/weapon/card/id/C = I
|
||||
visible_message("<span class='info'>[usr] swipes a card through [src].</span>")
|
||||
visible_message("<span class='info'>[user] swipes a card through [src].</span>")
|
||||
if(transaction_locked && !transaction_paid)
|
||||
if(linked_account)
|
||||
var/attempt_pin = input("Enter pin code", "EFTPOS transaction") as num
|
||||
@@ -204,7 +186,7 @@
|
||||
if(D)
|
||||
if(transaction_amount <= D.money)
|
||||
playsound(src, 'sound/machines/chime.ogg', 50, 1)
|
||||
src.visible_message("[bicon(src)] The [src] chimes.")
|
||||
visible_message("[bicon(src)] The [src] chimes.")
|
||||
transaction_paid = 1
|
||||
|
||||
//transfer the money
|
||||
@@ -233,11 +215,11 @@
|
||||
T.time = worldtime2text()
|
||||
linked_account.transaction_log.Add(T)
|
||||
else
|
||||
to_chat(usr, "[bicon(src)]<span class='warning'>You don't have that much money!</span>")
|
||||
to_chat(user, "[bicon(src)]<span class='warning'>You don't have that much money!</span>")
|
||||
else
|
||||
to_chat(usr, "[bicon(src)]<span class='warning'>Unable to access account. Check security settings and try again.</span>")
|
||||
to_chat(user, "[bicon(src)]<span class='warning'>Unable to access account. Check security settings and try again.</span>")
|
||||
else
|
||||
to_chat(usr, "[bicon(src)]<span class='warning'>EFTPOS is not connected to an account.</span>")
|
||||
to_chat(user, "[bicon(src)]<span class='warning'>EFTPOS is not connected to an account.</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/event/blob
|
||||
announceWhen = 12
|
||||
announceWhen = 60
|
||||
endWhen = 120
|
||||
var/obj/effect/blob/core/Blob
|
||||
|
||||
@@ -10,9 +10,15 @@
|
||||
var/turf/T = pick(blobstart)
|
||||
if(!T)
|
||||
return kill()
|
||||
Blob = new /obj/effect/blob/core(T, 200)
|
||||
for(var/i = 1; i < rand(3, 6), i++)
|
||||
Blob.process()
|
||||
var/list/candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1)
|
||||
var/mob/C
|
||||
if(candidates.len)
|
||||
C = pick(candidates)
|
||||
Blob = new /obj/effect/blob/core(T, new_overmind=C.client)
|
||||
for(var/i in 1 to 5)
|
||||
Blob.process()
|
||||
else
|
||||
return kill()
|
||||
|
||||
/datum/event/blob/tick()
|
||||
if(!Blob)
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
output = /obj/item/weapon/reagent_containers/food/snacks/fried_shrimp
|
||||
|
||||
/datum/deepfryer_special/banana
|
||||
input = "banana"
|
||||
input = /obj/item/weapon/reagent_containers/food/snacks/grown/banana
|
||||
output = /obj/item/weapon/reagent_containers/food/snacks/friedbanana
|
||||
|
||||
/datum/deepfryer_special/potato_chips
|
||||
@@ -84,7 +84,7 @@
|
||||
output = /obj/item/weapon/reagent_containers/food/snacks/chips
|
||||
|
||||
/datum/deepfryer_special/corn_chips
|
||||
input = "corn"
|
||||
input = /obj/item/weapon/reagent_containers/food/snacks/grown/corn
|
||||
output = /obj/item/weapon/reagent_containers/food/snacks/cornchips
|
||||
|
||||
/datum/deepfryer_special/fried_tofu
|
||||
|
||||
@@ -156,6 +156,7 @@
|
||||
if(stat & BROKEN || panel_open)
|
||||
return
|
||||
user.set_machine(src)
|
||||
add_fingerprint(user)
|
||||
var/dat
|
||||
if(processing)
|
||||
dat += "<div class='statusDisplay'>Biogenerator is processing! Please wait...</div><BR>"
|
||||
@@ -207,6 +208,9 @@
|
||||
|
||||
/obj/machinery/biogenerator/attack_hand(mob/user)
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/biogenerator/attack_ghost(mob/user)
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/biogenerator/proc/activate()
|
||||
if(usr.stat != 0)
|
||||
@@ -302,7 +306,7 @@
|
||||
|
||||
/obj/machinery/biogenerator/Topic(href, href_list)
|
||||
if(..() || panel_open)
|
||||
return
|
||||
return 1
|
||||
|
||||
usr.set_machine(src)
|
||||
|
||||
|
||||
@@ -90,16 +90,17 @@
|
||||
if(..())
|
||||
return
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/plantgenes/attack_ghost(mob/user)
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/plantgenes/interact(mob/user)
|
||||
add_fingerprint(user)
|
||||
user.set_machine(src)
|
||||
if(!user)
|
||||
return
|
||||
|
||||
var/datum/browser/popup = new(user, "plantdna", "Plant DNA Manipulator", 450, 600)
|
||||
if(!(in_range(src, user) || issilicon(user)))
|
||||
popup.close()
|
||||
return
|
||||
|
||||
var/dat = ""
|
||||
|
||||
@@ -216,7 +217,7 @@
|
||||
|
||||
/obj/machinery/plantgenes/Topic(var/href, var/list/href_list)
|
||||
if(..())
|
||||
return
|
||||
return 1
|
||||
usr.set_machine(src)
|
||||
|
||||
if(href_list["eject_seed"] && !operation)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#define HYDRO_CYCLES_PER_AGE 2 //Adjust this to adjust how many hydroponics cycles it takes to increase age. Positive integers only.
|
||||
|
||||
/obj/machinery/hydroponics
|
||||
name = "hydroponics tray"
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
@@ -20,10 +22,12 @@
|
||||
var/lastproduce = 0 //Last time it was harvested
|
||||
var/lastcycle = 0 //Used for timing of cycles.
|
||||
var/cycledelay = 200 //About 10 seconds / cycle
|
||||
var/current_cycle = 0 //Used for tracking when to age
|
||||
var/harvest = 0 //Ready to harvest?
|
||||
var/obj/item/seeds/myseed = null //The currently planted seed
|
||||
var/rating = 1
|
||||
var/wrenchable = 1
|
||||
var/lid_state = 0
|
||||
var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpollinate one plant
|
||||
var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses
|
||||
var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
|
||||
@@ -108,6 +112,20 @@
|
||||
|
||||
return connected
|
||||
|
||||
/obj/machinery/hydroponics/AltClick()
|
||||
if(wrenchable && !usr.stat && !usr.lying && Adjacent(usr))
|
||||
toggle_lid(usr)
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/hydroponics/proc/toggle_lid(mob/living/user)
|
||||
if(!user || user.stat || user.restrained())
|
||||
return
|
||||
|
||||
lid_state = !lid_state
|
||||
to_chat(user, "<span class='notice'>You [lid_state ? "close" : "open"] the tray's lid.</span>")
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/machinery/hydroponics/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
|
||||
if(!myseed)
|
||||
@@ -136,7 +154,10 @@
|
||||
lastcycle = world.time
|
||||
if(myseed && !dead)
|
||||
// Advance age
|
||||
age++
|
||||
current_cycle++
|
||||
if(current_cycle == HYDRO_CYCLES_PER_AGE)
|
||||
age++
|
||||
current_cycle = 0
|
||||
if(age < myseed.maturation)
|
||||
lastproduce = age
|
||||
|
||||
@@ -267,6 +288,9 @@
|
||||
overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "gaia_blessing")
|
||||
set_light(3)
|
||||
|
||||
if(lid_state)
|
||||
overlays += image('icons/obj/hydroponics/equipment.dmi', icon_state = "hydrocover")
|
||||
|
||||
update_icon_hoses()
|
||||
|
||||
if(myseed)
|
||||
@@ -904,6 +928,9 @@
|
||||
/obj/machinery/hydroponics/attack_hand(mob/user)
|
||||
if(issilicon(user)) //How does AI know what plant is?
|
||||
return
|
||||
if(lid_state)
|
||||
to_chat(user, "<span class='warning'>You can't reach the plant through the cover.</span>")
|
||||
return
|
||||
if(harvest)
|
||||
myseed.harvest(user)
|
||||
else if(dead)
|
||||
@@ -1013,4 +1040,6 @@
|
||||
to_chat(user, "<span class='notice'>You clear up [src]!</span>")
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
..()
|
||||
|
||||
#undef HYDRO_CYCLES_PER_AGE
|
||||
@@ -124,12 +124,17 @@
|
||||
src.amount = am
|
||||
|
||||
/obj/machinery/seed_extractor/attack_hand(mob/user)
|
||||
user.set_machine(src)
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/seed_extractor/attack_ghost(mob/user)
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/seed_extractor/interact(mob/user)
|
||||
if (stat)
|
||||
if(stat)
|
||||
return 0
|
||||
|
||||
add_fingerprint(user)
|
||||
user.set_machine(src)
|
||||
|
||||
var/dat = "<b>Stored seeds:</b><br>"
|
||||
|
||||
@@ -149,7 +154,7 @@
|
||||
|
||||
/obj/machinery/seed_extractor/Topic(var/href, var/list/href_list)
|
||||
if(..())
|
||||
return
|
||||
return 1
|
||||
usr.set_machine(src)
|
||||
|
||||
href_list["li"] = text2num(href_list["li"])
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/var/list/datum/lighting_corner/all_lighting_corners = list()
|
||||
/var/total_lighting_corners = 0
|
||||
/var/datum/lighting_corner/dummy/dummy_lighting_corner = new
|
||||
// Because we can control each corner of every lighting overlay.
|
||||
// And corners get shared between multiple turfs (unless you're on the corners of the map, then 1 corner doesn't).
|
||||
@@ -32,7 +32,7 @@
|
||||
/datum/lighting_corner/New(var/turf/new_turf, var/diagonal)
|
||||
. = ..()
|
||||
|
||||
all_lighting_corners += src
|
||||
total_lighting_corners++
|
||||
|
||||
masters[new_turf] = turn(diagonal, 180)
|
||||
z = new_turf.z
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
var/list/all_lighting_overlays = list() // Global list of lighting overlays.
|
||||
/var/total_lighting_overlays = 0
|
||||
/atom/movable/lighting_overlay
|
||||
name = ""
|
||||
mouse_opacity = 0
|
||||
@@ -21,7 +21,7 @@ var/list/all_lighting_overlays = list() // Global list of lighting overlays.
|
||||
/atom/movable/lighting_overlay/New(var/atom/loc, var/no_update = FALSE)
|
||||
. = ..()
|
||||
verbs.Cut()
|
||||
global.all_lighting_overlays += src
|
||||
total_lighting_overlays++
|
||||
|
||||
var/turf/T = loc //If this runtimes atleast we'll know what's creating overlays outside of turfs.
|
||||
T.lighting_overlay = src
|
||||
@@ -77,7 +77,7 @@ var/list/all_lighting_overlays = list() // Global list of lighting overlays.
|
||||
return
|
||||
|
||||
/atom/movable/lighting_overlay/Destroy()
|
||||
global.all_lighting_overlays -= src
|
||||
total_lighting_overlays--
|
||||
global.lighting_update_overlays -= src
|
||||
global.lighting_update_overlays_old -= src
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/var/list/datum/light_source/all_lighting_sources = list()
|
||||
/var/total_lighting_sources = 0
|
||||
// This is where the fun begins.
|
||||
// These are the main datums that emit light.
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
var/force_update
|
||||
|
||||
/datum/light_source/New(var/atom/owner, var/atom/top)
|
||||
all_lighting_sources += src
|
||||
total_lighting_sources++
|
||||
source_atom = owner // Set our new owner.
|
||||
if(!source_atom.light_sources)
|
||||
source_atom.light_sources = list()
|
||||
@@ -62,11 +62,14 @@
|
||||
|
||||
// Kill ourselves.
|
||||
/datum/light_source/proc/destroy()
|
||||
all_lighting_sources -= src
|
||||
total_lighting_sources--
|
||||
destroyed = TRUE
|
||||
force_update()
|
||||
if(source_atom)
|
||||
source_atom.light_sources -= src
|
||||
if(!source_atom.light_sources)
|
||||
log_runtime(EXCEPTION("Atom [source_atom] was a light source, but lacked a light source list!\n"), source_atom)
|
||||
else
|
||||
source_atom.light_sources -= src
|
||||
|
||||
if(top_atom)
|
||||
top_atom.light_sources -= src
|
||||
|
||||
@@ -169,7 +169,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
else
|
||||
var/response
|
||||
var/alertmsg = "Are you -sure- you want to ghost?\n([warningmsg]. If you ghost now, you probably won't be able to rejoin the round! You can't change your mind, so choose wisely!)"
|
||||
response = alert(src, alertmsg,"Are you sure you want to ghost?","Ghost","Stay in body")
|
||||
response = alert(src, alertmsg,"Are you sure you want to ghost?","Stay in body","Ghost")
|
||||
if(response != "Ghost")
|
||||
return //didn't want to ghost after-all
|
||||
resting = 1
|
||||
@@ -641,10 +641,22 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
client.images -= ghostimage //remove ourself
|
||||
|
||||
/mob/proc/can_admin_interact()
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/mob/proc/can_advanced_admin_interact()
|
||||
return FALSE
|
||||
|
||||
/mob/dead/observer/can_admin_interact()
|
||||
return check_rights(R_ADMIN, 0, src)
|
||||
|
||||
/mob/dead/observer/can_advanced_admin_interact()
|
||||
if(!can_admin_interact())
|
||||
return FALSE
|
||||
|
||||
if(client && client.advanced_admin_interaction)
|
||||
return TRUE
|
||||
|
||||
return FALSE
|
||||
|
||||
//this is a mob verb instead of atom for performance reasons
|
||||
//see /mob/verb/examinate() in mob.dm for more info
|
||||
|
||||
@@ -37,3 +37,12 @@
|
||||
return
|
||||
|
||||
. = src.emote_dead(message)
|
||||
|
||||
/mob/dead/observer/handle_track(var/message, var/verb = "says", var/datum/language/language, var/mob/speaker = null, var/speaker_name, var/atom/follow_target, var/hard_to_hear)
|
||||
return "[speaker_name] ([ghost_follow_link(follow_target, ghost=src)])"
|
||||
|
||||
/mob/dead/observer/handle_speaker_name(var/mob/speaker = null, var/vname, var/hard_to_hear)
|
||||
var/speaker_name = ..()
|
||||
if(speaker && (speaker_name != speaker.real_name) && !isAI(speaker)) //Announce computer and various stuff that broadcasts doesn't use it's real name but AI's can't pretend to be other mobs.
|
||||
speaker_name = "[speaker.real_name] ([speaker_name])"
|
||||
return speaker_name
|
||||
@@ -117,65 +117,8 @@
|
||||
if(hard_to_hear)
|
||||
message = stars(message)
|
||||
|
||||
var/speaker_name = "unknown"
|
||||
if(speaker)
|
||||
speaker_name = speaker.name
|
||||
|
||||
if(vname)
|
||||
speaker_name = vname
|
||||
if(hard_to_hear)
|
||||
speaker_name = "unknown"
|
||||
|
||||
var/changed_voice
|
||||
|
||||
if(isAI(src) && !hard_to_hear)
|
||||
var/jobname // the mob's "job"
|
||||
var/mob/living/carbon/human/impersonating //The crewmember being impersonated, if any.
|
||||
|
||||
if(ishuman(speaker))
|
||||
var/mob/living/carbon/human/H = speaker
|
||||
|
||||
var/obj/item/weapon/card/id/id = H.wear_id
|
||||
if((istype(id) && id.is_untrackable()) && H.HasVoiceChanger())
|
||||
changed_voice = 1
|
||||
var/mob/living/carbon/human/I = locate(speaker_name)
|
||||
if(I)
|
||||
impersonating = I
|
||||
jobname = impersonating.get_assignment()
|
||||
else
|
||||
jobname = "Unknown"
|
||||
else
|
||||
jobname = H.get_assignment()
|
||||
|
||||
else if(iscarbon(speaker)) // Nonhuman carbon mob
|
||||
jobname = "No ID"
|
||||
else if(isAI(speaker))
|
||||
jobname = "AI"
|
||||
else if(isrobot(speaker))
|
||||
jobname = "Cyborg"
|
||||
else if(ispAI(speaker))
|
||||
jobname = "Personal AI"
|
||||
else if(isAutoAnnouncer(speaker))
|
||||
var/mob/living/automatedannouncer/AA = speaker
|
||||
jobname = AA.role
|
||||
else
|
||||
jobname = "Unknown"
|
||||
|
||||
if(changed_voice)
|
||||
if(impersonating)
|
||||
track = "<a href='byond://?src=[UID()];track=\ref[impersonating]'>[speaker_name] ([jobname])</a>"
|
||||
else
|
||||
track = "[speaker_name] ([jobname])"
|
||||
else
|
||||
if(istype(follow_target, /mob/living/simple_animal/bot))
|
||||
track = "<a href='byond://?src=[UID()];trackbot=\ref[follow_target]'>[speaker_name] ([jobname])</a>"
|
||||
else
|
||||
track = "<a href='byond://?src=[UID()];track=\ref[speaker]'>[speaker_name] ([jobname])</a>"
|
||||
|
||||
if(isobserver(src))
|
||||
if(speaker && (speaker_name != speaker.real_name) && !isAI(speaker)) //Announce computer and various stuff that broadcasts doesn't use it's real name but AI's can't pretend to be other mobs.
|
||||
speaker_name = "[speaker.real_name] ([speaker_name])"
|
||||
track = "[speaker_name] ([ghost_follow_link(follow_target, ghost=src)])"
|
||||
var/speaker_name = handle_speaker_name(speaker, vname, hard_to_hear)
|
||||
track = handle_track(message, verb, language, speaker, speaker_name, follow_target, hard_to_hear)
|
||||
|
||||
var/formatted
|
||||
if(language)
|
||||
@@ -190,6 +133,22 @@
|
||||
else
|
||||
to_chat(src, "[part_a][speaker_name][part_b][formatted]</span></span>")
|
||||
|
||||
/mob/proc/handle_speaker_name(var/mob/speaker = null, var/vname, var/hard_to_hear)
|
||||
var/speaker_name = "unknown"
|
||||
if(speaker)
|
||||
speaker_name = speaker.name
|
||||
|
||||
if(vname)
|
||||
speaker_name = vname
|
||||
|
||||
if(hard_to_hear)
|
||||
speaker_name = "unknown"
|
||||
|
||||
return speaker_name
|
||||
|
||||
/mob/proc/handle_track(var/message, var/verb = "says", var/datum/language/language, var/mob/speaker = null, var/speaker_name, var/atom/follow_target, var/hard_to_hear)
|
||||
return
|
||||
|
||||
/mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null)
|
||||
if(!client)
|
||||
return
|
||||
|
||||
@@ -82,6 +82,17 @@ I'm using this for Stat to give it a more nifty interface to work with
|
||||
/mob/living/carbon/brain/proc/has_synthetic_assistance()
|
||||
return (container && istype(container, /obj/item/device/mmi)) || in_contents_of(/obj/mecha)
|
||||
|
||||
/mob/living/carbon/brain/proc/get_race()
|
||||
if(container)
|
||||
var/obj/item/device/mmi/M = container
|
||||
if(istype(M) && M.held_brain)
|
||||
return M.held_brain.dna.get_species_name()
|
||||
else
|
||||
return "Artificial Life"
|
||||
if(istype(loc, /obj/item/organ/internal/brain))
|
||||
var/obj/item/organ/internal/brain/B = loc
|
||||
return B.dna.get_species_name()
|
||||
|
||||
/mob/living/carbon/brain/Stat()
|
||||
..()
|
||||
if(has_synthetic_assistance())
|
||||
|
||||
@@ -494,7 +494,8 @@
|
||||
msg += "<span class = 'deptradio'>Medical records:</span> <a href='?src=[UID()];medrecord=`'>\[View\]</a> <a href='?src=[UID()];medrecordadd=`'>\[Add comment\]</a>\n"
|
||||
|
||||
|
||||
if(print_flavor_text()) msg += "[print_flavor_text()]\n"
|
||||
if(print_flavor_text() && !skipface)
|
||||
msg += "[print_flavor_text()]\n"
|
||||
|
||||
msg += "*---------*</span>"
|
||||
if(pose)
|
||||
|
||||
@@ -1049,12 +1049,11 @@
|
||||
if(R.fields["id"] == E.fields["id"])
|
||||
if(hasHUD(usr,"medical"))
|
||||
read = 1
|
||||
var/counter = 1
|
||||
while(R.fields[text("com_[]", counter)])
|
||||
to_chat(usr, text("[]", R.fields[text("com_[]", counter)]))
|
||||
counter++
|
||||
if(counter == 1)
|
||||
to_chat(usr, "No comment found")
|
||||
if(length(R.fields["comments"]))
|
||||
for(var/c in R.fields["comments"])
|
||||
to_chat(usr, c)
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>No comment found</span>")
|
||||
to_chat(usr, "<a href='?src=[UID()];medrecordadd=`'>\[Add comment\]</a>")
|
||||
|
||||
if(!read)
|
||||
@@ -1076,18 +1075,15 @@
|
||||
for(var/datum/data/record/R in data_core.medical)
|
||||
if(R.fields["id"] == E.fields["id"])
|
||||
if(hasHUD(usr,"medical"))
|
||||
var/t1 = sanitize(copytext(input("Add Comment:", "Med. records", null, null) as message,1,MAX_MESSAGE_LEN))
|
||||
if( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"medical")) )
|
||||
var/t1 = copytext(trim(sanitize(input("Add Comment:", "Med. records", null, null) as message)), 1, MAX_MESSAGE_LEN)
|
||||
if(!t1 || usr.stat || usr.restrained() || !hasHUD(usr, "medical"))
|
||||
return
|
||||
var/counter = 1
|
||||
while(R.fields[text("com_[]", counter)])
|
||||
counter++
|
||||
if(istype(usr,/mob/living/carbon/human))
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/U = usr
|
||||
R.fields[text("com_[counter]")] = text("Made by [U.get_authentification_name()] ([U.get_assignment()]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]<BR>[t1]")
|
||||
if(istype(usr,/mob/living/silicon/robot))
|
||||
R.fields["comments"] += "Made by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [worldtime2text()]<BR>[t1]"
|
||||
if(isrobot(usr))
|
||||
var/mob/living/silicon/robot/U = usr
|
||||
R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.modtype] [U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year]<BR>[t1]")
|
||||
R.fields["comments"] += "Made by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [worldtime2text()]<BR>[t1]"
|
||||
|
||||
if(href_list["lookitem"])
|
||||
var/obj/item/I = locate(href_list["lookitem"])
|
||||
|
||||
@@ -105,7 +105,9 @@
|
||||
/mob/living/carbon/human/handle_speech_problems(var/message, var/verb)
|
||||
var/list/returns[3]
|
||||
var/speech_problem_flag = 0
|
||||
var/span = mind.speech_span
|
||||
var/span = ""
|
||||
if(mind)
|
||||
span = mind.speech_span
|
||||
|
||||
if(silent || (disabilities & MUTE))
|
||||
message = ""
|
||||
@@ -228,4 +230,4 @@
|
||||
if(istype(r_ear, /obj/item/device/radio/headset))
|
||||
R = r_ear
|
||||
if(R.translate_binary)
|
||||
. = TRUE
|
||||
. = TRUE
|
||||
|
||||
@@ -298,6 +298,10 @@
|
||||
scream_verb = "shrieks"
|
||||
male_scream_sound = 'sound/voice/shriek1.ogg'
|
||||
female_scream_sound = 'sound/voice/shriek1.ogg'
|
||||
male_cough_sounds = list('sound/voice/shriekcough.ogg')
|
||||
female_cough_sounds = list('sound/voice/shriekcough.ogg')
|
||||
male_sneeze_sound = 'sound/voice/shrieksneeze.ogg'
|
||||
female_sneeze_sound = 'sound/voice/shrieksneeze.ogg'
|
||||
|
||||
icon_skin_tones = list(
|
||||
1 = "Default Green",
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
|
||||
/mob/living/ghostize(can_reenter_corpse = 1)
|
||||
var/prev_client = client
|
||||
if(..())
|
||||
. = ..()
|
||||
if(.)
|
||||
if(ranged_ability && prev_client)
|
||||
ranged_ability.remove_mousepointer(prev_client)
|
||||
|
||||
|
||||
@@ -618,9 +618,10 @@ var/list/ai_verbs_default = list(
|
||||
sleep(40)
|
||||
continue
|
||||
|
||||
return
|
||||
|
||||
return
|
||||
else if(href_list["open"])
|
||||
var/mob/target = locate(href_list["open"]) in mob_list
|
||||
if(target)
|
||||
open_nearest_door(target)
|
||||
|
||||
/mob/living/silicon/ai/bullet_act(var/obj/item/projectile/Proj)
|
||||
..(Proj)
|
||||
@@ -1092,52 +1093,6 @@ var/list/ai_verbs_default = list(
|
||||
aiRadio.interact(src)
|
||||
|
||||
|
||||
/mob/living/silicon/ai/proc/open_nearest_door(mob/living/target)
|
||||
if(!istype(target))
|
||||
return
|
||||
spawn(0)
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
var/obj/item/weapon/card/id/id = H.wear_id
|
||||
if(istype(id) && id.is_untrackable())
|
||||
to_chat(src, "Unable to locate an airlock")
|
||||
return
|
||||
if(H.digitalcamo)
|
||||
to_chat(src, "Unable to locate an airlock")
|
||||
return
|
||||
if(!near_camera(target))
|
||||
to_chat(src, "Target is not near any active cameras.")
|
||||
return
|
||||
var/obj/machinery/door/airlock/tobeopened
|
||||
var/dist = -1
|
||||
for(var/obj/machinery/door/airlock/D in range(3,target))
|
||||
if(!D.density)
|
||||
continue
|
||||
if(dist < 0)
|
||||
dist = get_dist(D, target)
|
||||
// to_chat(world, dist)
|
||||
tobeopened = D
|
||||
else
|
||||
if(dist > get_dist(D, target))
|
||||
dist = get_dist(D, target)
|
||||
// to_chat(world, dist)
|
||||
tobeopened = D
|
||||
// to_chat(world, "found [tobeopened.name] closer")
|
||||
else
|
||||
// to_chat(world, "[D.name] not close enough | [get_dist(D, target)] | [dist]")
|
||||
if(tobeopened)
|
||||
switch(alert(src, "Do you want to open \the [tobeopened] for [target]?","Doorknob_v2a.exe","Yes","No"))
|
||||
if("Yes")
|
||||
var/nhref = "src=[tobeopened.UID()];aiEnable=7"
|
||||
tobeopened.Topic(nhref, params2list(nhref), tobeopened, 1)
|
||||
to_chat(src, "\blue You've opened \the [tobeopened] for [target].")
|
||||
if("No")
|
||||
to_chat(src, "\red You deny the request.")
|
||||
else
|
||||
to_chat(src, "\red You've failed to open an airlock for [target]")
|
||||
return
|
||||
|
||||
|
||||
/mob/living/silicon/ai/proc/check_unable(flags = 0)
|
||||
if(stat == DEAD)
|
||||
to_chat(usr, "<span class='warning'>You are dead!</span>")
|
||||
@@ -1234,3 +1189,37 @@ var/list/ai_verbs_default = list(
|
||||
view_core() //A BYOND bug requires you to be viewing your core before your verbs update
|
||||
verbs += /mob/living/silicon/ai/proc/choose_modules
|
||||
malf_picker = new /datum/module_picker
|
||||
|
||||
/mob/living/silicon/ai/proc/open_nearest_door(mob/living/target)
|
||||
if(!istype(target))
|
||||
return
|
||||
|
||||
if(target && target.can_track())
|
||||
var/obj/machinery/door/airlock/A = null
|
||||
|
||||
var/dist = -1
|
||||
for(var/obj/machinery/door/airlock/D in range(3, target))
|
||||
if(!D.density)
|
||||
continue
|
||||
|
||||
var/curr_dist = get_dist(D, target)
|
||||
|
||||
if(dist < 0)
|
||||
dist = curr_dist
|
||||
A = D
|
||||
else if(dist > curr_dist)
|
||||
dist = curr_dist
|
||||
A = D
|
||||
|
||||
if(istype(A))
|
||||
switch(alert(src, "Do you want to open \the [A] for [target]?", "Doorknob_v2a.exe", "Yes", "No"))
|
||||
if("Yes")
|
||||
A.AIShiftClick()
|
||||
to_chat(src, "<span class='notice'>You open \the [A] for [target].</span>")
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You deny the request.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='warning'>Unable to locate an airlock near [target].</span>")
|
||||
|
||||
else
|
||||
to_chat(src, "<span class='warning'>Target is not on or near any active cameras on the station.</span>")
|
||||
@@ -1,3 +1,70 @@
|
||||
/*
|
||||
* AI Saycode
|
||||
*/
|
||||
|
||||
|
||||
/mob/living/silicon/ai/handle_track(var/message, var/verb = "says", var/datum/language/language, var/mob/speaker = null, var/speaker_name, var/atom/follow_target, var/hard_to_hear)
|
||||
if(hard_to_hear)
|
||||
return
|
||||
|
||||
var/jobname // the mob's "job"
|
||||
var/mob/living/carbon/human/impersonating //The crewmember being impersonated, if any.
|
||||
var/changed_voice
|
||||
|
||||
if(ishuman(speaker))
|
||||
var/mob/living/carbon/human/H = speaker
|
||||
|
||||
var/obj/item/weapon/card/id/id = H.wear_id
|
||||
if((istype(id) && id.is_untrackable()) && H.HasVoiceChanger())
|
||||
changed_voice = 1
|
||||
var/mob/living/carbon/human/I = locate(speaker_name)
|
||||
if(I)
|
||||
impersonating = I
|
||||
jobname = impersonating.get_assignment()
|
||||
else
|
||||
jobname = "Unknown"
|
||||
else
|
||||
jobname = H.get_assignment()
|
||||
|
||||
else if(iscarbon(speaker)) // Nonhuman carbon mob
|
||||
jobname = "No ID"
|
||||
else if(isAI(speaker))
|
||||
jobname = "AI"
|
||||
else if(isrobot(speaker))
|
||||
jobname = "Cyborg"
|
||||
else if(ispAI(speaker))
|
||||
jobname = "Personal AI"
|
||||
else if(isAutoAnnouncer(speaker))
|
||||
var/mob/living/automatedannouncer/AA = speaker
|
||||
jobname = AA.role
|
||||
else
|
||||
jobname = "Unknown"
|
||||
|
||||
var/track = ""
|
||||
var/mob/mob_to_track = null
|
||||
if(changed_voice)
|
||||
if(impersonating)
|
||||
mob_to_track = impersonating
|
||||
else
|
||||
track = "[speaker_name] ([jobname])"
|
||||
else
|
||||
if(istype(follow_target, /mob/living/simple_animal/bot))
|
||||
track = "<a href='byond://?src=[UID()];trackbot=\ref[follow_target]'>[speaker_name] ([jobname])</a>"
|
||||
else
|
||||
mob_to_track = speaker
|
||||
|
||||
if(mob_to_track)
|
||||
track = "<a href='byond://?src=[UID()];track=\ref[mob_to_track]'>[speaker_name] ([jobname])</a>"
|
||||
track += "<a href='byond://?src=[UID()];open=\ref[mob_to_track]'>\[OPEN\]</a>"
|
||||
|
||||
return track
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* AI VOX Announcements
|
||||
*/
|
||||
|
||||
var/announcing_vox = 0 // Stores the time of the last announcement
|
||||
var/const/VOX_CHANNEL = 200
|
||||
var/const/VOX_DELAY = 100
|
||||
|
||||
@@ -263,6 +263,9 @@
|
||||
interact(H)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/attack_ghost(mob/M)
|
||||
interact(M)
|
||||
|
||||
/mob/living/simple_animal/bot/attack_ai(mob/user)
|
||||
if(!topic_denied(user))
|
||||
@@ -818,7 +821,7 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
return 1
|
||||
add_fingerprint(usr)
|
||||
|
||||
if((href_list["power"]) && (bot_core.allowed(usr) || !locked))
|
||||
if((href_list["power"]) && (bot_core.allowed(usr) || !locked || usr.can_admin_interact()))
|
||||
if(on)
|
||||
turn_off()
|
||||
else
|
||||
@@ -838,6 +841,7 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
to_chat(usr, "<span class='warning'>[text_hack]</span>")
|
||||
show_laws()
|
||||
bot_reset()
|
||||
add_logs(usr, src, "hacked")
|
||||
else if(!hacked)
|
||||
to_chat(usr, "<span class='userdanger'>[text_dehack_fail]</span>")
|
||||
else
|
||||
@@ -846,8 +850,9 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
to_chat(usr, "<span class='notice'>[text_dehack]</span>")
|
||||
show_laws()
|
||||
bot_reset()
|
||||
add_logs(usr, src, "dehacked")
|
||||
if("ejectpai")
|
||||
if(paicard && (!locked || issilicon(usr) || check_rights(R_ADMIN, 0, usr)))
|
||||
if(paicard && (!locked || issilicon(usr) || usr.can_admin_interact()))
|
||||
to_chat(usr, "<span class='notice'>You eject [paicard] from [bot_name]</span>")
|
||||
ejectpai(usr)
|
||||
update_controls()
|
||||
@@ -867,19 +872,21 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/bot/proc/topic_denied(mob/user) //Access check proc for bot topics! Remember to place in a bot's individual Topic if desired.
|
||||
if(user.can_admin_interact())
|
||||
return 0
|
||||
if(user.incapacitated() || !(issilicon(user) || in_range(src, user)))
|
||||
return 1
|
||||
// 0 for access, 1 for denied.
|
||||
if(emagged == 2) //An emagged bot cannot be controlled by humans, silicons can if one hacked it.
|
||||
if(!hacked) //Manually emagged by a human - access denied to all.
|
||||
return 1
|
||||
else if(!issilicon(user) && !check_rights(R_ADMIN, 0, user)) //Bot is hacked, so only silicons and admins are allowed access.
|
||||
else if(!issilicon(user)) //Bot is hacked, so only silicons are allowed access.
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/bot/proc/hack(mob/user)
|
||||
var/hack
|
||||
if(issilicon(user) || check_rights(R_ADMIN, 0, user)) //Allows silicons or admins to toggle the emag status of a bot.
|
||||
if(issilicon(user) || user.can_admin_interact()) //Allows silicons or admins to toggle the emag status of a bot.
|
||||
hack += "[emagged == 2 ? "Software compromised! Unit may exhibit dangerous or erratic behavior." : "Unit operating normally. Release safety lock?"]<BR>"
|
||||
hack += "Harm Prevention Safety System: <A href='?src=[UID()];operation=hack'>[emagged ? "<span class='bad'>DANGER</span>" : "Engaged"]</A><BR>"
|
||||
else if(!locked) //Humans with access can use this option to hide a bot from the AI's remote control panel and PDA control.
|
||||
@@ -888,7 +895,7 @@ Pass a positive integer as an argument to override a bot's default speed.
|
||||
|
||||
/mob/living/simple_animal/bot/proc/showpai(mob/user)
|
||||
var/eject = ""
|
||||
if(!locked || issilicon(usr) || check_rights(R_ADMIN, 0, user))
|
||||
if(!locked || issilicon(usr) || user.can_admin_interact())
|
||||
if(paicard || allow_pai)
|
||||
eject += "Personality card status: "
|
||||
if(paicard)
|
||||
|
||||
@@ -204,7 +204,7 @@ Status: []<BR>
|
||||
Behaviour controls are [locked ? "locked" : "unlocked"]<BR>
|
||||
Maintenance panel panel is [open ? "opened" : "closed"]"},
|
||||
text("<A href='?src=[UID()];power=1'>[on ? "On" : "Off"]</A>"))
|
||||
if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
|
||||
if(!locked || issilicon(user) || user.can_admin_interact())
|
||||
dat += text({"<BR>Cleans Blood: []<BR>"}, text("<A href='?src=[UID()];operation=blood'>[blood ? "Yes" : "No"]</A>"))
|
||||
dat += text({"<BR>Patrol station: []<BR>"}, text("<A href='?src=[UID()];operation=patrol'>[auto_patrol ? "Yes" : "No"]</A>"))
|
||||
return dat
|
||||
|
||||
@@ -106,7 +106,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]<BR>"},
|
||||
|
||||
"<A href='?src=[UID()];power=1'>[on ? "On" : "Off"]</A>" )
|
||||
|
||||
if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
|
||||
if(!locked || issilicon(user) || user.can_admin_interact())
|
||||
if(!lasercolor)
|
||||
dat += text({"<BR>
|
||||
Arrest Unidentifiable Persons: []<BR>
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
dat += "Maintenance panel panel is [open ? "opened" : "closed"]<BR>"
|
||||
dat += "Tiles left: [amount]<BR>"
|
||||
dat += "Behvaiour controls are [locked ? "locked" : "unlocked"]<BR>"
|
||||
if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
|
||||
if(!locked || issilicon(user) || user.can_admin_interact())
|
||||
dat += "Add tiles to new hull plating: <A href='?src=[UID()];operation=autotile'>[autotile ? "Yes" : "No"]</A><BR>"
|
||||
dat += "Replace floor tiles: <A href='?src=[UID()];operation=replace'>[replacetiles ? "Yes" : "No"]</A><BR>"
|
||||
dat += "Finds tiles: <A href='?src=[UID()];operation=tiles'>[eattiles ? "Yes" : "No"]</A><BR>"
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
else
|
||||
dat += "None Loaded"
|
||||
dat += "<br>Behaviour controls are [locked ? "locked" : "unlocked"]<hr>"
|
||||
if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
|
||||
if(!locked || issilicon(user) || user.can_admin_interact())
|
||||
dat += "<TT>Healing Threshold: "
|
||||
dat += "<a href='?src=[UID()];adj_threshold=-10'>--</a> "
|
||||
dat += "<a href='?src=[UID()];adj_threshold=-5'>-</a> "
|
||||
|
||||
@@ -284,7 +284,7 @@
|
||||
dat += "<b>Destination:</b> [!destination ? "<i>none</i>" : destination]<BR>"
|
||||
dat += "<b>Power level:</b> [cell ? cell.percent() : 0]%"
|
||||
|
||||
if(locked && !ai && !check_rights(R_ADMIN, 0, user))
|
||||
if(locked && !ai && !user.can_admin_interact())
|
||||
dat += " <br /><div class='notice'>Controls are locked</div><A href='?src=[UID()];op=unlock'>Unlock Controls</A>"
|
||||
else
|
||||
dat += " <br /><div class='notice'>Controls are unlocked</div><A href='?src=[UID()];op=lock'>Lock Controls</A><BR><BR>"
|
||||
|
||||
@@ -119,7 +119,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
|
||||
|
||||
"<A href='?src=[UID()];power=1'>[on ? "On" : "Off"]</A>" )
|
||||
|
||||
if(!locked || issilicon(user) || check_rights(R_ADMIN, 0, user))
|
||||
if(!locked || issilicon(user) || user.can_admin_interact())
|
||||
dat += text({"<BR>
|
||||
Arrest Unidentifiable Persons: []<BR>
|
||||
Arrest for Unauthorized Weapons: []<BR>
|
||||
|
||||
@@ -161,8 +161,8 @@
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/Found(atom/A)
|
||||
if(istype(A, /obj/machinery/hydroponics))
|
||||
var/obj/machinery/hydroponics/Hydro = A
|
||||
if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit)
|
||||
wanted_objects |= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted
|
||||
if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit && !Hydro.lid_state)
|
||||
wanted_objects |= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered
|
||||
return 1
|
||||
..()
|
||||
|
||||
@@ -188,12 +188,12 @@
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/proc/pollinate(obj/machinery/hydroponics/Hydro)
|
||||
if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit)
|
||||
if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit || Hydro.lid_state)
|
||||
target = null
|
||||
return
|
||||
|
||||
target = null //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity
|
||||
wanted_objects -= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted
|
||||
wanted_objects -= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted and uncovered
|
||||
Hydro.recent_bee_visit = TRUE
|
||||
spawn(BEE_TRAY_RECENT_VISIT)
|
||||
if(Hydro)
|
||||
|
||||
@@ -470,7 +470,7 @@
|
||||
if(CHEF)
|
||||
clothes_s = new /icon(uniform_dmi, "chef_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "chefhat"), ICON_OVERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/head.dmi', "chef"), ICON_OVERLAY)
|
||||
if(prob(1))
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apronchef"), ICON_OVERLAY)
|
||||
switch(backbag)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
if(ui_ref)
|
||||
var/obj/machinery/alarm/alarm = locate(href_list["alarm"]) in (monitored_alarms ? monitored_alarms : machines)
|
||||
if(alarm)
|
||||
var/datum/topic_state/TS = generate_state(alarm)
|
||||
var/datum/topic_state/air_alarm/TS = generate_state(alarm)
|
||||
alarm.ui_interact(usr, master_ui = ui_ref, state = TS)
|
||||
|
||||
/datum/nano_module/atmos_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
/datum/topic_state/air_alarm/href_list(var/mob/user)
|
||||
var/list/extra_href = list()
|
||||
extra_href["remote_connection"] = 1
|
||||
extra_href["remote_connection"] = TRUE
|
||||
extra_href["remote_access"] = has_access(user)
|
||||
|
||||
return extra_href
|
||||
|
||||
@@ -18,8 +18,10 @@ var/list/alldepartments = list()
|
||||
active_power_usage = 200
|
||||
|
||||
var/obj/item/weapon/card/id/scan = null // identification
|
||||
|
||||
var/authenticated = 0
|
||||
var/sendcooldown = 0 // to avoid spamming fax messages
|
||||
var/cooldown_time = 1800
|
||||
|
||||
var/department = "Unknown" // our department
|
||||
|
||||
@@ -37,9 +39,12 @@ var/list/alldepartments = list()
|
||||
fax_network = "Central Command Quantum Entanglement Network"
|
||||
long_range_enabled = 1
|
||||
|
||||
/obj/machinery/photocopier/faxmachine/attack_hand(mob/user as mob)
|
||||
/obj/machinery/photocopier/faxmachine/attack_hand(mob/user)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/photocopier/faxmachine/attack_ghost(mob/user)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/photocopier/faxmachine/attackby(obj/item/weapon/item, mob/user, params)
|
||||
if(istype(item,/obj/item/weapon/card/id) && !scan)
|
||||
scan(item)
|
||||
@@ -49,7 +54,7 @@ var/list/alldepartments = list()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/photocopier/faxmachine/emag_act(user as mob)
|
||||
/obj/machinery/photocopier/faxmachine/emag_act(mob/user)
|
||||
if(!emagged)
|
||||
emagged = 1
|
||||
to_chat(user, "<span class='notice'>The transmitters realign to an unknown source!</span>")
|
||||
@@ -64,13 +69,14 @@ var/list/alldepartments = list()
|
||||
|
||||
/obj/machinery/photocopier/faxmachine/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
|
||||
var/data[0]
|
||||
var/is_authenticated = is_authenticated(user)
|
||||
|
||||
if(scan)
|
||||
data["scan_name"] = scan.name
|
||||
else
|
||||
data["scan_name"] = "-----"
|
||||
data["authenticated"] = authenticated
|
||||
if(!authenticated)
|
||||
data["authenticated"] = is_authenticated
|
||||
if(!is_authenticated)
|
||||
data["network"] = "Disconnected"
|
||||
else if(!emagged)
|
||||
data["network"] = fax_network
|
||||
@@ -91,12 +97,20 @@ var/list/alldepartments = list()
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/photocopier/faxmachine/proc/is_authenticated(mob/user)
|
||||
if(authenticated)
|
||||
return TRUE
|
||||
else if(user.can_admin_interact())
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/photocopier/faxmachine/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
|
||||
var/is_authenticated = is_authenticated(usr)
|
||||
if(href_list["send"])
|
||||
if(copyitem && authenticated)
|
||||
if(copyitem && is_authenticated)
|
||||
if((destination in admin_departments) || (destination in hidden_admin_departments))
|
||||
send_admin_fax(usr, destination)
|
||||
else
|
||||
@@ -111,7 +125,7 @@ var/list/alldepartments = list()
|
||||
if(copyitem)
|
||||
copyitem.forceMove(get_turf(src))
|
||||
if(ishuman(usr))
|
||||
if(!usr.get_active_hand())
|
||||
if(!usr.get_active_hand() && Adjacent(usr))
|
||||
usr.put_in_hands(copyitem)
|
||||
to_chat(usr, "<span class='notice'>You eject \the [copyitem] from \the [src].</span>")
|
||||
copyitem = null
|
||||
@@ -128,7 +142,7 @@ var/list/alldepartments = list()
|
||||
scan()
|
||||
|
||||
if(href_list["dept"])
|
||||
if(authenticated)
|
||||
if(is_authenticated)
|
||||
var/lastdestination = destination
|
||||
var/list/combineddepartments = alldepartments.Copy()
|
||||
if(long_range_enabled)
|
||||
@@ -142,10 +156,10 @@ var/list/alldepartments = list()
|
||||
destination = lastdestination
|
||||
|
||||
if(href_list["auth"])
|
||||
if((!authenticated) && scan)
|
||||
if(!is_authenticated && scan)
|
||||
if(check_access(scan))
|
||||
authenticated = 1
|
||||
else if(authenticated)
|
||||
else if(is_authenticated)
|
||||
authenticated = 0
|
||||
|
||||
if(href_list["rename"])
|
||||
@@ -165,26 +179,42 @@ var/list/alldepartments = list()
|
||||
/obj/machinery/photocopier/faxmachine/proc/scan(var/obj/item/weapon/card/id/card = null)
|
||||
if(scan) // Card is in machine
|
||||
if(ishuman(usr))
|
||||
scan.forceMove(get_turf(usr))
|
||||
if(!usr.get_active_hand())
|
||||
scan.forceMove(get_turf(src))
|
||||
if(!usr.get_active_hand() && Adjacent(usr))
|
||||
usr.put_in_hands(scan)
|
||||
scan = null
|
||||
else
|
||||
scan.forceMove(get_turf(src))
|
||||
scan = null
|
||||
else
|
||||
else if(Adjacent(usr))
|
||||
if(!card)
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if(istype(I, /obj/item/weapon/card/id))
|
||||
usr.drop_item()
|
||||
I.forceMove(src)
|
||||
scan = I
|
||||
else
|
||||
if(istype(card))
|
||||
usr.drop_item()
|
||||
card.forceMove(src)
|
||||
scan = card
|
||||
else if(istype(card))
|
||||
usr.drop_item()
|
||||
card.forceMove(src)
|
||||
scan = card
|
||||
nanomanager.update_uis(src)
|
||||
|
||||
/obj/machinery/photocopier/faxmachine/verb/eject_id()
|
||||
set category = null
|
||||
set name = "Eject ID Card"
|
||||
set src in oview(1)
|
||||
|
||||
if(usr.restrained())
|
||||
return
|
||||
|
||||
if(scan)
|
||||
to_chat(usr, "You remove \the [scan] from \the [src].")
|
||||
scan.forceMove(get_turf(src))
|
||||
if(!usr.get_active_hand() && Adjacent(usr))
|
||||
usr.put_in_hands(scan)
|
||||
scan = null
|
||||
else
|
||||
to_chat(usr, "There is nothing to remove from \the [src].")
|
||||
|
||||
/obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination,var/mob/sender)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
@@ -208,7 +238,6 @@ var/list/alldepartments = list()
|
||||
F.sent_at = world.time
|
||||
|
||||
visible_message("[src] beeps, \"Message transmitted successfully.\"")
|
||||
//sendcooldown = 600
|
||||
else
|
||||
visible_message("[src] beeps, \"Error transmitting message.\"")
|
||||
|
||||
@@ -241,6 +270,9 @@ var/list/alldepartments = list()
|
||||
/obj/machinery/photocopier/faxmachine/proc/send_admin_fax(var/mob/sender, var/destination)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
if(sendcooldown)
|
||||
return
|
||||
|
||||
use_power(200)
|
||||
|
||||
@@ -272,15 +304,15 @@ var/list/alldepartments = list()
|
||||
message_admins(sender, "CENTCOM FAX", destination, rcvdcopy, "#006100")
|
||||
if("Syndicate")
|
||||
message_admins(sender, "SYNDICATE FAX", destination, rcvdcopy, "#DC143C")
|
||||
sendcooldown = 1800
|
||||
sleep(50)
|
||||
visible_message("[src] beeps, \"Message transmitted successfully.\"")
|
||||
sendcooldown = cooldown_time
|
||||
spawn(50)
|
||||
visible_message("[src] beeps, \"Message transmitted successfully.\"")
|
||||
|
||||
|
||||
/obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/faxtype, var/obj/item/sent, font_colour="#9A04D1")
|
||||
var/msg = "<span class='boldnotice'><font color='[font_colour]'>[faxname]: </font>[key_name(sender, 1)] (<A HREF='?_src_=holder;adminplayeropts=\ref[sender]'>PP</A>) (<A HREF='?_src_=vars;Vars=[sender.UID()]'>VV</A>) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([admin_jump_link(sender)]) | REPLY: (<A HREF='?_src_=holder;CentcommReply=\ref[sender]'>RADIO</A>) (<a href='?_src_=holder;AdminFaxCreate=\ref[sender];originfax=\ref[src];faxtype=[faxtype];replyto=\ref[sent]'>FAX</a>) (<A HREF='?_src_=holder;subtlemessage=\ref[sender]'>SM</A>) | REJECT: (<A HREF='?_src_=holder;FaxReplyTemplate=\ref[sender];originfax=\ref[src]'>TEMPLATE</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[sender]'>BSA</A>) (<A HREF='?_src_=holder;EvilFax=\ref[sender];originfax=\ref[src]'>EVILFAX</A>) </span>: Receiving '[sent.name]' via secure connection... <a href='?_src_=holder;AdminFaxView=\ref[sent]'>view message</a>"
|
||||
var/msg = "<span class='boldnotice'><font color='[font_colour]'>[faxname]: </font> [key_name_admin(sender)] | REPLY: (<A HREF='?_src_=holder;CentcommReply=\ref[sender]'>RADIO</A>) (<a href='?_src_=holder;AdminFaxCreate=\ref[sender];originfax=\ref[src];faxtype=[faxtype];replyto=\ref[sent]'>FAX</a>) (<A HREF='?_src_=holder;subtlemessage=\ref[sender]'>SM</A>) | REJECT: (<A HREF='?_src_=holder;FaxReplyTemplate=\ref[sender];originfax=\ref[src]'>TEMPLATE</A>) (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[sender]'>BSA</A>) (<A HREF='?_src_=holder;EvilFax=\ref[sender];originfax=\ref[src]'>EVILFAX</A>) </span>: Receiving '[sent.name]' via secure connection... <a href='?_src_=holder;AdminFaxView=\ref[sent]'>view message</a>"
|
||||
for(var/client/C in admins)
|
||||
if(R_EVENT & C.holder.rights)
|
||||
if(check_rights(R_EVENT, 0, C.mob))
|
||||
to_chat(C, msg)
|
||||
if(C.prefs.sound & SOUND_ADMINHELP)
|
||||
C << 'sound/effects/adminhelp.ogg'
|
||||
|
||||
@@ -146,17 +146,15 @@
|
||||
for(var/datum/data/record/G in data_core.general)
|
||||
var/datum/data/record/M
|
||||
for(var/datum/data/record/R in data_core.medical)
|
||||
if((R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"]))
|
||||
if(R.fields["name"] == G.fields["name"] || R.fields["id"] == G.fields["id"])
|
||||
M = R
|
||||
break
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src)
|
||||
P.info = "<CENTER><B>Medical Record</B></CENTER><BR>"
|
||||
P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]]<BR>\nSex: [G.fields["sex"]]<BR>\nAge: [G.fields["age"]]<BR>\nFingerprint: [G.fields["fingerprint"]]<BR>\nPhysical Status: [G.fields["p_stat"]]<BR>\nMental Status: [G.fields["m_stat"]]<BR>"
|
||||
P.info += "<BR>\n<CENTER><B>Medical Data</B></CENTER><BR>\nBlood Type: [M.fields["b_type"]]<BR>\nDNA: [M.fields["b_dna"]]<BR>\n<BR>\nMinor Disabilities: [M.fields["mi_dis"]]<BR>\nDetails: [M.fields["mi_dis_d"]]<BR>\n<BR>\nMajor Disabilities: [M.fields["ma_dis"]]<BR>\nDetails: [M.fields["ma_dis_d"]]<BR>\n<BR>\nAllergies: [M.fields["alg"]]<BR>\nDetails: [M.fields["alg_d"]]<BR>\n<BR>\nCurrent Diseases: [M.fields["cdi"]] (per disease info placed in log/comment section)<BR>\nDetails: [M.fields["cdi_d"]]<BR>\n<BR>\nImportant Notes:<BR>\n\t[M.fields["notes"]]<BR>\n<BR>\n<CENTER><B>Comments/Log</B></CENTER><BR>"
|
||||
var/counter = 1
|
||||
while(M.fields["com_[counter]"])
|
||||
P.info += "[M.fields["com_[counter]"]]<BR>"
|
||||
counter++
|
||||
for(var/c in M.fields["comments"])
|
||||
P.info += "[c]<BR>"
|
||||
P.info += "</TT>"
|
||||
P.name = "paper - '[G.fields["name"]]'"
|
||||
virgin = 0 //tabbing here is correct- it's possible for people to try and use it
|
||||
|
||||
@@ -19,10 +19,13 @@
|
||||
var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier!
|
||||
var/mob/living/ass = null
|
||||
|
||||
/obj/machinery/photocopier/attack_ai(mob/user as mob)
|
||||
/obj/machinery/photocopier/attack_ai(mob/user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/photocopier/attack_ghost(mob/user)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/photocopier/attack_hand(mob/user as mob)
|
||||
/obj/machinery/photocopier/attack_hand(mob/user)
|
||||
user.set_machine(src)
|
||||
|
||||
var/dat = "Photocopier<BR><BR>"
|
||||
@@ -47,6 +50,9 @@
|
||||
return
|
||||
|
||||
/obj/machinery/photocopier/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
if(href_list["copy"])
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
@@ -446,3 +446,7 @@
|
||||
origin_tech = "combat=3"
|
||||
caliber = "laser"
|
||||
max_ammo = 20
|
||||
|
||||
/obj/item/ammo_box/magazine/laser/update_icon()
|
||||
..()
|
||||
icon_state = "[initial(icon_state)]-[Ceiling(ammo_count(0)/20)*20]"
|
||||
|
||||
@@ -179,6 +179,17 @@
|
||||
var/mob_aoe = FALSE
|
||||
var/list/hit_overlays = list()
|
||||
|
||||
/obj/item/projectile/kinetic/pod
|
||||
range = 4
|
||||
|
||||
/obj/item/projectile/kinetic/pod/regular
|
||||
damage = 50
|
||||
pressure_decrease = 0.5
|
||||
|
||||
/obj/item/projectile/kinetic/pod/enhanced
|
||||
turf_aoe = TRUE
|
||||
mob_aoe = TRUE
|
||||
|
||||
/obj/item/projectile/kinetic/on_range()
|
||||
strike_thing()
|
||||
..()
|
||||
|
||||
@@ -261,3 +261,7 @@
|
||||
fire_sound = 'sound/weapons/emitter2.ogg'
|
||||
can_suppress = 0
|
||||
burst_size = 2
|
||||
|
||||
/obj/item/weapon/gun/projectile/automatic/lasercarbine/update_icon()
|
||||
..()
|
||||
icon_state = "lasercarbine[magazine ? "-[Ceiling(get_ammo(0)/5)*5]" : ""]"
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 0),
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = list("bluecherryjelly" = 0),
|
||||
/obj/item/weapon/reagent_containers/food/snacks/egg = list("egg" = -5),
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/rice = list("rice" = -5),
|
||||
|
||||
//Grinder stuff, but only if dry
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/coffee/robusta = list("coffeepowder" = 0, "morphine" = 0),
|
||||
|
||||
@@ -88,16 +88,15 @@
|
||||
|
||||
/datum/reagent/consumable/drink/blackeye_brew/on_mob_life(mob/living/M)
|
||||
if(prob(25))
|
||||
var/list/tider_talk = list("CLOWN IS VALID, RIGHT?",
|
||||
"SHITMINS! SHITMINS! SHITMINS!",
|
||||
"FURRIES ARE OPPRESSED!",
|
||||
"I OWN THIS SERVER NOW, I JUST BOUGHT IT.",
|
||||
var/list/tider_talk = list("I OWN THIS STATION NOW, I JUST BOUGHT IT.",
|
||||
"SECRET TECHNIQUE: TOOLBOX TO THE FACE!",
|
||||
"SECRET TECHNIQUE: PLASMA CANISTER FIRE!",
|
||||
"SECRET TECHNIQUE: TABLE AND DISPOSAL!",
|
||||
"[pick("MY BROTHER", " MY DOG", "MY BEST FRIEND", "THE BORER", "GEORGE MELONS", "SHITMINS")] DID IT!",
|
||||
"WHAT DO YOU MEAN [pick("Barrack Obama", "John Cena", "Hughe Jass", "Hitler", "xX360noscopeXx")] ISN'T AN ACCEPTABLE NAME?",
|
||||
"WHAT THE FUCK DID YOU JUST FUCKING SAY ABOUT ME, YOU LITTLE BITCH? I'LL HAVE YOU KNOW I GRADUATED TOP OF MY CLASS IN...")
|
||||
"[pick("MY BROTHER", " MY DOG", "MY BEST FRIEND", "THE BORER", "GEORGE MELONS", "BADMINS")] DID IT!",
|
||||
";s WHATS SPACE LAW?!",
|
||||
"I BOUGHT THESE GLOVES, NOT STEAL THEM",
|
||||
"THIS DOOR WAS SHOCKED WHEN I GOT HERE",
|
||||
"ANIMALS ARE NOT CREW")
|
||||
M.say(pick(tider_talk))
|
||||
..()
|
||||
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
/obj/item/weapon/reagent_containers/blood
|
||||
name = "BloodPack"
|
||||
var/base_name = "BloodPack"
|
||||
desc = "Contains blood used for transfusion."
|
||||
icon = 'icons/obj/bloodpack.dmi'
|
||||
icon_state = "empty"
|
||||
volume = 200
|
||||
|
||||
var/blood_type = null
|
||||
var/label_text = ""
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/New()
|
||||
..()
|
||||
@@ -16,6 +18,7 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/on_reagent_change()
|
||||
update_icon()
|
||||
update_name_label()
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/update_icon()
|
||||
var/percent = round((reagents.total_volume / volume) * 100)
|
||||
@@ -27,27 +30,55 @@
|
||||
if(51 to INFINITY)
|
||||
icon_state = "full"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/pen) || istype(I, /obj/item/device/flashlight/pen))
|
||||
var/tmp_label = sanitize(input(user, "Enter a label for [name]","Label",label_text))
|
||||
if(length(tmp_label) > MAX_NAME_LEN)
|
||||
to_chat(user, "<span class='warning'>The label can be at most [MAX_NAME_LEN] characters long.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You set the label to \"[tmp_label]\".</span>")
|
||||
label_text = tmp_label
|
||||
update_name_label()
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/proc/update_name_label()
|
||||
if(reagents.total_volume == 0)
|
||||
base_name = "Empty BloodPack"
|
||||
desc = "Seems pretty useless... Maybe if there were a way to fill it?"
|
||||
else
|
||||
base_name = "BloodPack"
|
||||
desc = "Contains blood used for transfusion."
|
||||
if(label_text == "")
|
||||
name = base_name
|
||||
else
|
||||
name = "[base_name] ([label_text])"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/random/New()
|
||||
blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-")
|
||||
..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/APlus
|
||||
blood_type = "A+"
|
||||
label_text = "A+"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/AMinus
|
||||
blood_type = "A-"
|
||||
label_text = "A-"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/BPlus
|
||||
blood_type = "B+"
|
||||
label_text = "B+"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/BMinus
|
||||
blood_type = "B-"
|
||||
label_text = "B-"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/OPlus
|
||||
blood_type = "O+"
|
||||
label_text = "O+"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/OMinus
|
||||
blood_type = "O-"
|
||||
label_text = "O-"
|
||||
|
||||
/obj/item/weapon/reagent_containers/blood/empty
|
||||
name = "Empty BloodPack"
|
||||
|
||||
@@ -872,29 +872,22 @@
|
||||
//weldingtool: unfasten and convert to obj/disposalconstruct
|
||||
|
||||
/obj/structure/disposalpipe/attackby(var/obj/item/I, var/mob/user, params)
|
||||
|
||||
var/turf/T = src.loc
|
||||
var/turf/T = get_turf(src)
|
||||
if(T.intact)
|
||||
return // prevent interaction with T-scanner revealed pipes
|
||||
src.add_fingerprint(user)
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
if(istype(I, /obj/item/weapon/weldingtool))
|
||||
var/obj/item/weapon/weldingtool/W = I
|
||||
|
||||
if(W.remove_fuel(0,user))
|
||||
playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
|
||||
// check if anything changed over 2 seconds
|
||||
var/turf/uloc = user.loc
|
||||
var/atom/wloc = W.loc
|
||||
to_chat(user, "Slicing the disposal pipe.")
|
||||
sleep(30)
|
||||
if(!W.isOn()) return
|
||||
if(user.loc == uloc && wloc == W.loc)
|
||||
if(W.remove_fuel(0, user))
|
||||
to_chat(user, "<span class='notice'>You begin slicing \the [src].</span>")
|
||||
playsound(loc, 'sound/items/Welder2.ogg', 100, 1)
|
||||
if(do_after(user, 30, target = src))
|
||||
to_chat(user, "<span class='notice'>You finish slicing \the [src].</span>")
|
||||
welded()
|
||||
else
|
||||
to_chat(user, "You must stay still while welding the pipe.")
|
||||
else
|
||||
to_chat(user, "You need more welding fuel to cut the pipe.")
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You need more welding fuel to cut the pipe.</span>")
|
||||
|
||||
// called when pipe is cut with welder
|
||||
/obj/structure/disposalpipe/proc/welded()
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
id = "s_holster"
|
||||
build_type = BIOGENERATOR
|
||||
materials = list(MAT_BIOMASS = 400)
|
||||
build_path = /obj/item/weapon/storage/belt/holster
|
||||
build_path = /obj/item/clothing/accessory/holster
|
||||
category = list("initial","Leather and Cloth")
|
||||
|
||||
/datum/design/leather_satchel
|
||||
|
||||
@@ -321,6 +321,7 @@
|
||||
|
||||
newsign.data["mob"] = null
|
||||
newsign.data["mobtype"] = /mob/living/carbon/human
|
||||
newsign.data["race"] = "Automated Signal"
|
||||
newsign.data["name"] = source
|
||||
newsign.data["realname"] = newsign.data["name"]
|
||||
newsign.data["job"] = "[job]"
|
||||
@@ -343,4 +344,4 @@
|
||||
|
||||
var/pass = S.relay_information(newsign, "/obj/machinery/telecomms/hub")
|
||||
if(!pass)
|
||||
S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters
|
||||
S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
*/
|
||||
|
||||
/obj/docking_port/stationary/transit
|
||||
name = "In Transit"
|
||||
name = "In transit"
|
||||
turf_type = /turf/space/transit
|
||||
|
||||
lock_shuttle_doors = 1
|
||||
@@ -183,7 +183,7 @@
|
||||
if(!..())
|
||||
return 0
|
||||
|
||||
name = "In Transit" //This looks weird, but- it means that the on-map instances can be named something actually usable to search for, but still appear correctly in terminals.
|
||||
name = "In transit" //This looks weird, but- it means that the on-map instances can be named something actually usable to search for, but still appear correctly in terminals.
|
||||
|
||||
shuttle_master.transit += src
|
||||
return 1
|
||||
@@ -676,41 +676,42 @@
|
||||
return
|
||||
if(!shuttleId)
|
||||
return
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
connect()
|
||||
add_fingerprint(user)
|
||||
ui_interact(user)
|
||||
|
||||
var/list/options = params2list(possible_destinations)
|
||||
/obj/machinery/computer/shuttle/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
var/obj/docking_port/mobile/M = shuttle_master.getShuttle(shuttleId)
|
||||
var/dat = "Status: [M ? M.getStatusText() : "*Missing*"]<br><br>"
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "shuttle_console.tmpl", M ? M.name : "shuttle", 300, 200)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/computer/shuttle/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
|
||||
var/data[0]
|
||||
var/obj/docking_port/mobile/M = shuttle_master.getShuttle(shuttleId)
|
||||
data["status"] = M ? M.getStatusText() : null
|
||||
if(M)
|
||||
var/destination_found
|
||||
data["shuttle"] = 1
|
||||
var/list/docking_ports = list()
|
||||
data["docking_ports"] = docking_ports
|
||||
var/list/options = params2list(possible_destinations)
|
||||
for(var/obj/docking_port/stationary/S in shuttle_master.stationary)
|
||||
if(!options.Find(S.id))
|
||||
continue
|
||||
if(!M.check_dock(S))
|
||||
continue
|
||||
destination_found = 1
|
||||
dat += "<A href='?src=[UID()];move=[S.id]'>Send to [S.name]</A><br>"
|
||||
if(!destination_found)
|
||||
dat += "<B>Shuttle Locked</B><br>"
|
||||
if(admin_controlled)
|
||||
dat += "Authorized personnel only<br>"
|
||||
dat += "<A href='?src=[UID()];request=1]'>Request Authorization</A><br>"
|
||||
if(docking_request)
|
||||
dat += "<A href='?src=[UID()];request=1]'>Request docking at NSS Cyberiad</A><br>"
|
||||
dat += "<a href='?src=[user.UID()];mach_close=computer'>Close</a>"
|
||||
docking_ports[++docking_ports.len] = list("name" = S.name, "id" = S.id)
|
||||
data["docking_ports_len"] = docking_ports.len
|
||||
data["admin_controlled"] = admin_controlled
|
||||
data["docking_request"] = docking_request
|
||||
|
||||
var/datum/browser/popup = new(user, "computer", M ? M.name : "shuttle", 300, 200)
|
||||
popup.set_content("<center>[dat]</center>")
|
||||
popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/shuttle/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
if(!allowed(usr))
|
||||
to_chat(usr, "<span class='danger'>Access denied.</span>")
|
||||
return
|
||||
@@ -728,7 +729,7 @@
|
||||
to_chat(usr, "<span class='warning'>Invalid shuttle requested.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>Unable to comply.</span>")
|
||||
updateUsrDialog()
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/shuttle/emag_act(mob/user)
|
||||
if(!emagged)
|
||||
@@ -760,10 +761,11 @@
|
||||
to_chat(usr, "<span class='notice'>Your request has been recieved by Centcom.</span>")
|
||||
log_admin("[key_name(usr)] requested to move the transport ferry to Centcom.")
|
||||
message_admins("<b>FERRY: <font color='blue'>[key_name_admin(usr)] (<A HREF='?_src_=holder;secretsfun=moveferry'>Move Ferry</a>)</b> is requesting to move the transport ferry to Centcom.</font>")
|
||||
. = 1
|
||||
nanomanager.update_uis(src)
|
||||
spawn(600) //One minute cooldown
|
||||
cooldown = 0
|
||||
|
||||
|
||||
/obj/machinery/computer/shuttle/ert
|
||||
name = "specops shuttle console"
|
||||
//circuit = /obj/item/weapon/circuitboard/ert
|
||||
@@ -846,6 +848,7 @@ var/global/trade_dockrequest_timelimit = 0
|
||||
to_chat(usr, "<span class='notice'>Request sent.</span>")
|
||||
event_announcement.Announce(docking_request_message, "Docking Request")
|
||||
trade_dockrequest_timelimit = world.time + 1200 // They have 2 minutes to approve the request.
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/shuttle/trade/sol
|
||||
req_access = list(access_trade_sol)
|
||||
|
||||
@@ -28,9 +28,8 @@
|
||||
firstloc = get_turf(my_atom)
|
||||
secondloc = get_step(firstloc,NORTH)
|
||||
olddir = dir
|
||||
var/proj_type = text2path(projectile_type)
|
||||
var/obj/item/projectile/projone = new proj_type(firstloc)
|
||||
var/obj/item/projectile/projtwo = new proj_type(secondloc)
|
||||
var/obj/item/projectile/projone = new projectile_type(firstloc)
|
||||
var/obj/item/projectile/projtwo = new projectile_type(secondloc)
|
||||
projone.starting = get_turf(my_atom)
|
||||
projone.firer = usr
|
||||
projone.def_zone = "chest"
|
||||
@@ -79,7 +78,7 @@
|
||||
desc = "You shouldn't be seeing this"
|
||||
icon = 'icons/vehicles/spacepod.dmi'
|
||||
icon_state = "blank"
|
||||
var/projectile_type
|
||||
var/obj/item/projectile/projectile_type
|
||||
var/shot_cost = 0
|
||||
var/shots_per = 1
|
||||
var/fire_sound
|
||||
@@ -89,7 +88,7 @@
|
||||
name = "disabler system"
|
||||
desc = "A weak taser system for space pods, fires disabler beams."
|
||||
icon_state = "weapon_taser"
|
||||
projectile_type = "/obj/item/projectile/beam/disabler"
|
||||
projectile_type = /obj/item/projectile/beam/disabler
|
||||
shot_cost = 400
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
|
||||
@@ -97,7 +96,7 @@
|
||||
name = "burst taser system"
|
||||
desc = "A weak taser system for space pods, this one fires 3 at a time."
|
||||
icon_state = "weapon_burst_taser"
|
||||
projectile_type = "/obj/item/projectile/beam/disabler"
|
||||
projectile_type = /obj/item/projectile/beam/disabler
|
||||
shot_cost = 1200
|
||||
shots_per = 3
|
||||
fire_sound = 'sound/weapons/Taser.ogg'
|
||||
@@ -107,7 +106,7 @@
|
||||
name = "laser system"
|
||||
desc = "A weak laser system for space pods, fires concentrated bursts of energy"
|
||||
icon_state = "weapon_laser"
|
||||
projectile_type = "/obj/item/projectile/beam"
|
||||
projectile_type = /obj/item/projectile/beam
|
||||
shot_cost = 600
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
|
||||
@@ -117,7 +116,7 @@
|
||||
desc = "A weak mining laser system for space pods, fires bursts of energy that cut through rock"
|
||||
icon = 'icons/goonstation/pods/ship.dmi'
|
||||
icon_state = "pod_taser"
|
||||
projectile_type = "/obj/item/projectile/kinetic"
|
||||
projectile_type = /obj/item/projectile/kinetic/pod
|
||||
shot_cost = 300
|
||||
fire_delay = 14
|
||||
fire_sound = 'sound/weapons/Kenetic_accel.ogg'
|
||||
@@ -127,7 +126,7 @@
|
||||
desc = "A mining laser system for space pods, fires bursts of energy that cut through rock"
|
||||
icon = 'icons/goonstation/pods/ship.dmi'
|
||||
icon_state = "pod_m_laser"
|
||||
projectile_type = "/obj/item/projectile/kinetic/super"
|
||||
projectile_type = /obj/item/projectile/kinetic/pod/regular
|
||||
shot_cost = 250
|
||||
fire_delay = 10
|
||||
fire_sound = 'sound/weapons/Kenetic_accel.ogg'
|
||||
@@ -137,7 +136,7 @@
|
||||
desc = "An enhanced mining laser system for space pods, fires bursts of energy that cut through rock"
|
||||
icon = 'icons/goonstation/pods/ship.dmi'
|
||||
icon_state = "pod_w_laser"
|
||||
projectile_type = "/obj/item/projectile/kinetic/hyper"
|
||||
projectile_type = /obj/item/projectile/kinetic/pod/enhanced
|
||||
shot_cost = 200
|
||||
fire_delay = 8
|
||||
fire_sound = 'sound/weapons/Kenetic_accel.ogg'
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
/datum/station_goal/bluespace_cannon/check_completion()
|
||||
if(..())
|
||||
return TRUE
|
||||
var/obj/machinery/bsa/full/B = locate()
|
||||
if(B && !B.stat && is_station_contact(B.z))
|
||||
return TRUE
|
||||
for(var/obj/machinery/bsa/full/B)
|
||||
if(B && !B.stat && is_station_contact(B.z))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/bsa
|
||||
@@ -139,21 +139,21 @@
|
||||
pixel_x = -192
|
||||
bound_width = 352
|
||||
bound_x = -192
|
||||
|
||||
|
||||
/obj/machinery/bsa/full/Destroy()
|
||||
if(controller && controller.cannon == src)
|
||||
controller.cannon = null
|
||||
controller = null
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/bsa/full/east
|
||||
icon_state = "cannon_east"
|
||||
cannon_direction = EAST
|
||||
|
||||
|
||||
/obj/machinery/bsa/full/admin
|
||||
power_used_per_shot = 0
|
||||
reload_cooldown = 100
|
||||
|
||||
|
||||
/obj/machinery/bsa/full/admin/east
|
||||
icon_state = "cannon_east"
|
||||
cannon_direction = EAST
|
||||
@@ -212,7 +212,7 @@
|
||||
|
||||
point.Beam(get_target_turf(), icon_state = "bsa_beam", time = 50, maxdistance = world.maxx, beam_type = /obj/effect/ebeam/deadly) //ZZZAP
|
||||
playsound(src, 'sound/machines/bsa_fire.ogg', 100, 1)
|
||||
|
||||
|
||||
message_admins("[key_name_admin(user)] has launched an artillery strike.")
|
||||
explosion(bullseye,ex_power,ex_power*2,ex_power*4)
|
||||
|
||||
@@ -268,26 +268,26 @@
|
||||
|
||||
var/area_aim = FALSE //should also show areas for targeting
|
||||
var/target_all_areas = FALSE //allows all areas (including admin areas) to be targeted
|
||||
|
||||
|
||||
/obj/machinery/computer/bsa_control/admin
|
||||
area_aim = TRUE
|
||||
target_all_areas = TRUE
|
||||
|
||||
|
||||
/obj/machinery/computer/bsa_control/admin/initialize()
|
||||
..()
|
||||
if(!cannon)
|
||||
cannon = deploy()
|
||||
|
||||
|
||||
/obj/machinery/computer/bsa_control/Destroy()
|
||||
if(cannon && cannon.controller == src)
|
||||
cannon.controller = null
|
||||
cannon = null
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/machinery/computer/bsa_control/process()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/machinery/computer/bsa_control/update_icon()
|
||||
if(stat & BROKEN)
|
||||
icon_state = icon_state_broken
|
||||
@@ -299,7 +299,7 @@
|
||||
icon_state = icon_state_active
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
|
||||
/obj/machinery/computer/bsa_control/attack_hand(mob/user)
|
||||
if(..())
|
||||
return 1
|
||||
@@ -318,7 +318,7 @@
|
||||
data["notice"] = notice
|
||||
if(target)
|
||||
data["target"] = get_target_name()
|
||||
|
||||
|
||||
if(cannon)
|
||||
var/reload_cooldown = cannon.reload_cooldown
|
||||
var/last_fire_time = cannon.last_fire_time
|
||||
@@ -331,13 +331,13 @@
|
||||
data["ready"] = minutes == 0 && seconds == 0
|
||||
else
|
||||
data["ready"] = FALSE
|
||||
|
||||
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/bsa_control/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
|
||||
if(href_list["build"])
|
||||
cannon = deploy()
|
||||
. = TRUE
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
// Satellites be actived to generate a shield that will block unorganic matter from passing it.
|
||||
/datum/station_goal/station_shield
|
||||
name = "Station Shield"
|
||||
var/coverage_goal = 500
|
||||
var/coverage_goal = 5000
|
||||
|
||||
/datum/station_goal/station_shield/get_report()
|
||||
return {"<b>Station Shield construction</b><br>
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
|
||||
/obj/vehicle/ambulance/Move(newloc, Dir)
|
||||
var/oldloc = loc
|
||||
if(bed && !Adjacent(bed))
|
||||
bed = null
|
||||
. = ..()
|
||||
if(bed && get_dist(oldloc, loc) <= 2)
|
||||
bed.Move(oldloc)
|
||||
|
||||
Reference in New Issue
Block a user