Merge remote-tracking branch 'ParadiseSS13/master' into toml-config

This commit is contained in:
AffectedArc07
2021-07-09 11:42:23 +01:00
210 changed files with 1803 additions and 2434 deletions
-1
View File
@@ -138,7 +138,6 @@ GLOBAL_PROTECT(banlist_savefile) // Obvious reasons
log_admin("Ban Expired: [key]")
message_admins("Ban Expired: [key]")
else
ban_unban_log_save("[key_name_admin(usr)] unbanned [key]")
log_admin("[key_name_admin(usr)] unbanned [key]")
message_admins("[key_name_admin(usr)] unbanned: [key]")
usr.client.holder.DB_ban_unban( ckey(key), BANTYPE_ANY_FULLBAN)
+6 -2
View File
@@ -166,7 +166,12 @@ GLOBAL_LIST_INIT(admin_verbs_debug, list(
/client/proc/toggle_medal_disable,
/client/proc/uid_log,
/client/proc/visualise_active_turfs,
/client/proc/reestablish_db_connection
/client/proc/reestablish_db_connection,
#ifdef REFERENCE_TRACKING
/datum/proc/find_refs,
/datum/proc/qdel_then_find_references,
/datum/proc/qdel_then_if_fail_find_references,
#endif
))
GLOBAL_LIST_INIT(admin_verbs_possess, list(
/proc/possess,
@@ -507,7 +512,6 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list(
return
if(++D.warns >= MAX_WARNS) //uh ohhhh...you'reee iiiiin trouuuubble O:)
ban_unban_log_save("[ckey] warned [warned_ckey], resulting in a [AUTOBANTIME] minute autoban.")
if(C)
message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban")
log_admin("[key_name(src)] has warned [key_name(C)] resulting in a [AUTOBANTIME] minute ban")
-4
View File
@@ -118,10 +118,6 @@ GLOBAL_DATUM_INIT(jobban_regex, /regex, regex("(\[\\S]+) - (\[^#]+\[^# ])(?: ##
/proc/jobban_unban_client(ckey, rank)
jobban_remove("[ckey] - [rank]")
/proc/ban_unban_log_save(formatted_log)
text2file(formatted_log,"data/ban_unban_log.txt")
/proc/jobban_remove(X)
for(var/i = 1; i <= length(GLOB.jobban_keylist); i++)
if( findtext(GLOB.jobban_keylist[i], "[X]") )
+1
View File
@@ -414,6 +414,7 @@
qdel(query_update)
message_admins("[key_name_admin(usr)] has lifted [pckey]'s ban.")
log_admin("[key_name(usr)] has lifted [pckey]'s ban.")
flag_account_for_forum_sync(pckey)
+1 -1
View File
@@ -78,7 +78,7 @@ proc/admin_proc()
NOTE: it checks usr! not src! So if you're checking somebody's rank in a proc which they did not call
you will have to do something like if(client.holder.rights & R_ADMIN) yourself.
*/
/proc/check_rights(rights_required, show_msg=1, mob/user = usr)
/proc/check_rights(rights_required, show_msg = TRUE, mob/user = usr)
if(user && user.client)
if(rights_required)
if(user.client.holder)
-1
View File
@@ -70,7 +70,6 @@
<A href='?src=[UID()];secretsfun=infiltrators_syndicate'>Send SIT - Syndicate Infiltration Team</A>&nbsp;&nbsp;
<A href='?src=[UID()];secretsfun=striketeam_syndicate'>Send in a Syndie Strike Team</A>&nbsp;&nbsp;
<BR><A href='?src=[UID()];secretsfun=striketeam'>Send in the Deathsquad</A>&nbsp;&nbsp;
<A href='?src=[UID()];secretsfun=honksquad'>Send in a HONKsquad</A><BR>
<A href='?src=[UID()];secretsfun=gimmickteam'>Send in a Gimmick Team</A><BR>
<b>Change Security Level</b><BR>
<A href='?src=[UID()];secretsfun=securitylevel0'>Security Level - Green</A>&nbsp;&nbsp;
-11
View File
@@ -487,7 +487,6 @@
if(!reason) return
log_admin("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]")
ban_unban_log_save("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]")
message_admins("<span class='notice'>[key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]</span>", 1)
GLOB.banlist_savefile.cd = "/base/[banfolder]"
to_chat(GLOB.banlist_savefile["reason"], reason)
@@ -519,7 +518,6 @@
return */
switch(alert("Reason: '[banreason]' Remove appearance ban?","Please Confirm","Yes","No"))
if("Yes")
ban_unban_log_save("[key_name(usr)] removed [key_name(M)]'s appearance ban")
log_admin("[key_name(usr)] removed [key_name(M)]'s appearance ban")
DB_ban_unban(M.ckey, BANTYPE_APPEARANCE)
appearance_unban(M)
@@ -532,7 +530,6 @@
if(!reason)
return
M = admin_ban_mobsearch(M, ban_ckey_param, usr)
ban_unban_log_save("[key_name(usr)] appearance banned [key_name(M)]. reason: [reason]")
log_admin("[key_name(usr)] appearance banned [key_name(M)]. \nReason: [reason]")
DB_ban_record(BANTYPE_APPEARANCE, M, -1, reason)
appearance_fullban(M, "[reason]; By [usr.ckey] on [time2text(world.realtime)]")
@@ -893,7 +890,6 @@
var/msg
M = admin_ban_mobsearch(M, ban_ckey_param, usr)
for(var/job in notbannedlist)
ban_unban_log_save("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes. reason: [reason]")
log_admin("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes")
DB_ban_record(BANTYPE_JOB_TEMP, M, mins, reason, job)
jobban_fullban(M, job, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") //Legacy banning does not support temporary jobbans.
@@ -914,7 +910,6 @@
var/msg
M = admin_ban_mobsearch(M, ban_ckey_param, usr)
for(var/job in notbannedlist)
ban_unban_log_save("[key_name(usr)] perma-jobbanned [key_name(M)] from [job]. reason: [reason]")
log_admin("[key_name(usr)] perma-banned [key_name(M)] from [job]")
DB_ban_record(BANTYPE_JOB_PERMA, M, -1, reason, job)
jobban_fullban(M, job, "[reason]; By [usr.ckey] on [time2text(world.realtime)]")
@@ -943,7 +938,6 @@
if(!reason) continue //skip if it isn't jobbanned anyway
switch(alert("Job: '[job]' Reason: '[reason]' Un-jobban?","Please Confirm","Yes","No"))
if("Yes")
ban_unban_log_save("[key_name(usr)] unjobbanned [key_name(M)] from [job]")
log_admin("[key_name(usr)] unbanned [key_name(M)] from [job]")
DB_ban_unban(M.ckey, BANTYPE_JOB_PERMA, job)
jobban_unban(M, job)
@@ -1068,7 +1062,6 @@
return
M = admin_ban_mobsearch(M, ban_ckey_param, usr)
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins)
ban_unban_log_save("[usr.client.ckey] has banned [M.ckey]. - Reason: [reason] - This will be removed in [mins] minutes.")
to_chat(M, "<span class='warning'><big><b>You have been banned by [usr.client.ckey].\nReason: [reason].</b></big></span>")
to_chat(M, "<span class='warning'>This is a temporary ban, it will be removed in [mins] minutes.</span>")
DB_ban_record(BANTYPE_TEMP, M, mins, reason)
@@ -1095,7 +1088,6 @@
to_chat(M, "<span class='warning'>To try to resolve this matter head to [GLOB.configuration.url.banappeals_url]</span>")
else
to_chat(M, "<span class='warning'>No ban appeals URL has been set.</span>")
ban_unban_log_save("[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This ban does not expire automatically and must be appealed.")
log_admin("[key_name(usr)] has banned [M.ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.")
message_admins("<span class='notice'>[key_name_admin(usr)] has banned [M.ckey].\nReason: [reason]\nThis ban does not expire automatically and must be appealed.</span>")
DB_ban_record(BANTYPE_PERMA, M, -1, reason)
@@ -2894,9 +2886,6 @@
spawn(0)
H.corgize()
ok = 1
if("honksquad")
if(usr.client.honksquad())
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Team - HONKsquad")
if("striketeam")
if(usr.client.strike_team())
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Team - Deathsquad")
+4 -1
View File
@@ -666,17 +666,19 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
message_admins("<span class='notice'>[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].</span>", 1)
/client/proc/robust_dress_shop()
var/list/outfits = list(
var/list/special_outfits = list(
"Naked",
"As Job...",
"Custom..."
)
var/list/outfits = list()
var/list/paths = subtypesof(/datum/outfit) - typesof(/datum/outfit/job)
for(var/path in paths)
var/datum/outfit/O = path //not much to initalize here but whatever
if(initial(O.can_be_admin_equipped))
outfits[initial(O.name)] = path
outfits = special_outfits + sortTim(outfits, /proc/cmp_text_asc)
var/dresscode = input("Select outfit", "Robust quick dress shop") as null|anything in outfits
if(isnull(dresscode))
@@ -692,6 +694,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
var/datum/outfit/O = path
if(initial(O.can_be_admin_equipped))
job_outfits[initial(O.name)] = path
job_outfits = sortTim(job_outfits, /proc/cmp_text_asc)
dresscode = input("Select job equipment", "Robust quick dress shop") as null|anything in job_outfits
dresscode = job_outfits[dresscode]
-142
View File
@@ -1,142 +0,0 @@
//HONKsquad
#define HONKSQUAD_POSSIBLE 6 //if more Commandos are needed in the future
GLOBAL_VAR_INIT(sent_honksquad, 0)
/client/proc/honksquad()
if(!SSticker)
to_chat(usr, "<font color='red'>The game hasn't started yet!</font>")
return
if(world.time < 6000)
to_chat(usr, "<font color='red'>There are [(6000-world.time)/10] seconds remaining before it may be called.</font>")
return
if(GLOB.sent_honksquad == 1)
to_chat(usr, "<font color='red'>Clown Planet has already dispatched a HONKsquad.</font>")
return
if(alert("Do you want to send in the HONKsquad? Once enabled, this is irreversible.",,"Yes","No")!="Yes")
return
alert("This 'mode' will go on until proper levels of HONK have been restored. You may also admin-call the evac shuttle when appropriate. Assigning the team's detailed task is recommended from there. While you will be able to manually pick the candidates from active ghosts, their assignment in the squad will be random.")
var/input = null
while(!input)
input = sanitize(copytext(input(src, "Please specify which mission the HONKsquad shall undertake.", "Specify Mission", ""),1,MAX_MESSAGE_LEN))
if(!input)
if(alert("Error, no mission set. Do you want to exit the setup process?",,"Yes","No")=="Yes")
return
if(GLOB.sent_honksquad)
to_chat(usr, "Looks like someone beat you to it. HONK.")
return
GLOB.sent_honksquad = 1
var/honksquad_number = HONKSQUAD_POSSIBLE //for selecting a leader
var/honk_leader_selected = 0 //when the leader is chosen. The last person spawned.
//Generates a list of HONKsquad from active ghosts. Then the user picks which characters to respawn as the commandos.
var/list/candidates = list() //candidates for being a commando out of all the active ghosts in world.
var/list/commandos = list() //actual commando ghosts as picked by the user.
for(var/mob/dead/observer/G in GLOB.player_list)
if(!G.client.holder && !G.client.is_afk()) //Whoever called/has the proc won't be added to the list.
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
for(var/i=HONKSQUAD_POSSIBLE,(i>0&&candidates.len),i--)//Decrease with every commando selected.
var/candidate = input("Pick characters to spawn as the HONKsquad. This will go on until there either no more ghosts to pick from or the slots are full.", "Active Players") as null|anything in candidates //It will auto-pick a person when there is only one candidate.
candidates -= candidate //Subtract from candidates.
commandos += candidate//Add their ghost to commandos.
//Spawns HONKsquad and equips them.
for(var/thing in GLOB.landmarks_list)
var/obj/effect/landmark/L = thing
if(honksquad_number<=0) break
if(L.name == "HONKsquad")
honk_leader_selected = honksquad_number == 1?1:0
var/mob/living/carbon/human/new_honksquad = create_honksquad(L, honk_leader_selected)
if(commandos.len)
new_honksquad.key = pick(commandos)
commandos -= new_honksquad.key
new_honksquad.internal = new_honksquad.s_store
new_honksquad.update_action_buttons_icon()
//So they don't forget their code or mission.
new_honksquad.mind.store_memory("<B>Mission:</B> <span class='warning'>[input].</span>")
to_chat(new_honksquad, "<span class='notice'>You are a HONKsquad. [!honk_leader_selected ? "commando" : "<B>LEADER</B>"] in the service of Clown Planet. You are called in cases of exteme low levels of HONK. You are NOT authorized to kill.\nYour current mission is: <span class='danger'>[input]</span></span>")
honksquad_number--
message_admins("<span class='notice'>[key_name_admin(usr)] has spawned a HONKsquad.</span>", 1)
log_admin("[key_name(usr)] used Spawn HONKsquad.")
return 1
/client/proc/create_honksquad(obj/spawn_location, honk_leader_selected = 0)
var/mob/living/carbon/human/new_honksquad = new(spawn_location.loc)
var/honksquad_leader_rank = pick("Lieutenant", "Captain", "Major")
var/honksquad_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major")
var/honksquad_name = pick(GLOB.clown_names)
var/datum/preferences/A = new()//Randomize appearance for the commando.
if(honk_leader_selected)
A.age = rand(35,45)
A.real_name = "[honksquad_leader_rank] [honksquad_name]"
else
A.real_name = "[honksquad_rank] [honksquad_name]"
A.copy_to(new_honksquad)
new_honksquad.dna.ready_dna(new_honksquad)//Creates DNA.
//Creates mind stuff.
new_honksquad.mind_initialize()
new_honksquad.mind.assigned_role = SPECIAL_ROLE_HONKSQUAD
new_honksquad.mind.special_role = SPECIAL_ROLE_HONKSQUAD
new_honksquad.mind.offstation_role = TRUE
new_honksquad.add_language("Clownish")
SSticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list.
new_honksquad.equip_honksquad(honk_leader_selected)
return new_honksquad
/mob/living/carbon/human/proc/equip_honksquad(honk_leader_selected = 0)
var/obj/item/radio/R = new /obj/item/radio/headset(src)
R.set_frequency(1442)
equip_to_slot_or_del(R, slot_l_ear)
equip_to_slot_or_del(new /obj/item/storage/backpack/clown(src), slot_back)
equip_to_slot_or_del(new /obj/item/storage/box/survival(src), slot_in_backpack)
if(src.gender == FEMALE)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat/sexy(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown/sexy(src), slot_w_uniform)
else
equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(src), slot_shoes)
equip_to_slot_or_del(new /obj/item/pda/clown(src), slot_wear_pda)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/reagent_containers/food/snacks/grown/banana(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/bikehorn(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/stamp/clown(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/toy/crayon/rainbow(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/reagent_containers/spray/waterflower(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/reagent_containers/food/pill/patch/jestosterone(src), slot_r_store)
if(prob(50))
equip_to_slot_or_del(new /obj/item/gun/energy/clown(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/gun/throw/piecannon(src), slot_in_backpack)
dna.SetSEState(GLOB.clumsyblock, TRUE)
singlemutcheck(src, GLOB.clumsyblock, MUTCHK_FORCED)
var/obj/item/card/id/W = new(src)
W.name = "[real_name]'s ID Card"
W.icon_state = "centcom_old"
W.access = list(ACCESS_CLOWN)//They get full station access.
W.assignment = "HONKsquad"
W.registered_name = real_name
equip_to_slot_or_del(W, slot_wear_id)
return 1
+4 -4
View File
@@ -27,7 +27,7 @@
/datum/admins/proc/CandCheck(role = null, mob/living/carbon/human/M, datum/game_mode/temp = null)
// You pass in ROLE define (optional), the applicant, and the gamemode, and it will return true / false depending on whether the applicant qualify for the candidacy in question
if(jobban_isbanned(M, "Syndicate"))
if(jobban_isbanned(M, ROLE_SYNDICATE))
return FALSE
if(M.stat || !M.mind || M.mind.special_role || M.mind.offstation_role)
return FALSE
@@ -199,7 +199,7 @@
for(var/mob/G in GLOB.respawnable_list)
if(istype(G) && G.client && (ROLE_OPERATIVE in G.client.prefs.be_special))
if(!jobban_isbanned(G, "operative") && !jobban_isbanned(G, "Syndicate"))
if(!jobban_isbanned(G, ROLE_OPERATIVE) && !jobban_isbanned(G, ROLE_SYNDICATE))
if(player_old_enough_antag(G.client,ROLE_OPERATIVE))
spawn(0)
switch(alert(G,"Do you wish to be considered for a nuke team being sent in?","Please answer in 30 seconds!","Yes","No"))
@@ -316,7 +316,7 @@
//Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
for(var/mob/G in GLOB.respawnable_list)
if(!jobban_isbanned(G, "Syndicate"))
if(!jobban_isbanned(G, ROLE_SYNDICATE))
spawn(0)
switch(alert(G,"Do you wish to be considered for an elite syndicate strike team being sent in?","Please answer in 30 seconds!","Yes","No"))
if("Yes")
@@ -427,7 +427,7 @@
for(var/mob/G in GLOB.respawnable_list)
if(istype(G) && G.client && (ROLE_RAIDER in G.client.prefs.be_special))
if(player_old_enough_antag(G.client,ROLE_RAIDER))
if(!jobban_isbanned(G, "raider") && !jobban_isbanned(G, "Syndicate"))
if(!jobban_isbanned(G, ROLE_RAIDER) && !jobban_isbanned(G, ROLE_SYNDICATE))
spawn(0)
switch(alert(G,"Do you wish to be considered for a vox raiding party arriving on the station?","Please answer in 30 seconds!","Yes","No"))
if("Yes")
-9
View File
@@ -59,15 +59,6 @@
if(X.prefs.sound & SOUND_ADMINHELP)
SEND_SOUND(X, sound('sound/effects/adminhelp.ogg'))
/proc/HONK_announce(text, mob/Sender)
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
msg = "<span class='boldnotice'><font color=pink>HONK: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;HONKReply=[Sender.UID()]'>RPLY</A>):</span> [msg]"
for(var/client/X in GLOB.admins)
if(R_EVENT & X.holder.rights)
to_chat(X, msg)
if(X.prefs.sound & SOUND_ADMINHELP)
SEND_SOUND(X, sound('sound/effects/adminhelp.ogg'))
/proc/ERT_Announce(text, mob/Sender, repeat_warning)
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
msg = "<span class='adminnotice'><b><font color=orange>ERT REQUEST: </font>[key_name(Sender, 1)] ([ADMIN_PP(Sender,"PP")]) ([ADMIN_VV(Sender,"VV")]) ([ADMIN_TP(Sender,"TP")]) ([ADMIN_SM(Sender,"SM")]) ([admin_jump_link(Sender)]) ([ADMIN_BSA(Sender,"BSA")]) (<A HREF='?_src_=holder;ErtReply=[Sender.UID()]'>RESPOND</A>):</b> [msg]</span>"
+10 -5
View File
@@ -498,11 +498,16 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!ckey)
var/list/candidates = list()
for(var/mob/M in GLOB.player_list)
if(M.stat != DEAD) continue //we are not dead!
if(!(ROLE_ALIEN in M.client.prefs.be_special)) continue //we don't want to be an alium
if(jobban_isbanned(M, "alien") || jobban_isbanned(M, "Syndicate")) continue //we are jobbanned
if(M.client.is_afk()) continue //we are afk
if(M.mind && M.mind.current && M.mind.current.stat != DEAD) continue //we have a live body we are tied to
if(M.stat != DEAD)
continue //we are not dead!
if(!(ROLE_ALIEN in M.client.prefs.be_special))
continue //we don't want to be an alium
if(jobban_isbanned(M, ROLE_ALIEN) || jobban_isbanned(M, ROLE_SYNDICATE))
continue //we are jobbanned
if(M.client.is_afk())
continue //we are afk
if(M.mind && M.mind.current && M.mind.current.stat != DEAD)
continue //we have a live body we are tied to
candidates += M.ckey
if(candidates.len)
ckey = input("Pick the player you want to respawn as a xeno.", "Suitable Candidates") as null|anything in candidates
@@ -153,7 +153,7 @@ GLOBAL_VAR_INIT(sent_syndicate_strike_team, 0)
equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite/sst(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
equip_to_slot_or_del(new /obj/item/storage/belt/military/sst(src), slot_belt)
equip_to_slot_or_del(new /obj/item/tank/jetpack/oxygen/harness(src), slot_s_store)
equip_to_slot_or_del(new /obj/item/tank/internals/oxygen/red(src), slot_s_store)
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_shoes)
equip_to_slot_or_del(new /obj/item/gun/projectile/automatic/l6_saw(src), slot_r_hand)
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/mm556x45(src), slot_in_backpack)
@@ -28,6 +28,7 @@
/datum/rep_purchase/item/pinpointer,
/datum/rep_purchase/item/baton,
/datum/rep_purchase/item/fulton,
/datum/rep_purchase/item/flare,
/datum/rep_purchase/blackout,
/datum/rep_purchase/item/zippo,
/datum/rep_purchase/item/balloon,
@@ -0,0 +1,9 @@
/**
* # Rep Purchase - Emergency escape flare
*/
/datum/rep_purchase/item/flare
name = "Emergency extraction kit"
description = "A kit that comes with an emergency escape flare, which will allow you to teleport to any beacon after a short activation delay. Also comes with a Syndicate teleporter beacon that only these flares and emagged teleporters can target."
cost = 2
stock = 3
item_type = /obj/item/storage/box/syndie_kit/escape_flare
@@ -363,6 +363,9 @@
// Greys get to keep their implant
if(isgrey(H) && istype(I, /obj/item/organ/internal/cyberimp/brain/speech_translator))
continue
// IPCs keep this implant, free of charge!
if(ismachineperson(H) && istype(I, /obj/item/organ/internal/cyberimp/arm/power_cord))
continue
// Try removing it
I = I.remove(H)
if(I)
+1 -1
View File
@@ -1,6 +1,6 @@
/obj/item/assembly/igniter
name = "igniter"
desc = "A small electronic device able to ignite combustable substances."
desc = "A small electronic device able to ignite combustible substances."
icon_state = "igniter"
materials = list(MAT_METAL=500, MAT_GLASS=50)
origin_tech = "magnets=1"
+1
View File
@@ -418,6 +418,7 @@
GLOB.admins -= src
GLOB.directory -= ckey
GLOB.clients -= src
QDEL_NULL(chatOutput)
if(movingmob)
movingmob.client_mobs_in_contents -= mob
UNSETEMPTY(movingmob.client_mobs_in_contents)
@@ -63,10 +63,6 @@
display_name = "Fur Cap"
path = /obj/item/clothing/head/furcap
/datum/gear/donor/mouse
display_name = "Mouse Headband"
path = /obj/item/clothing/head/kitty/mouse
/datum/gear/donor/fawkes
display_name = "Guy Fawkes mask"
path = /obj/item/clothing/mask/fawkes
@@ -138,10 +138,6 @@
path = /obj/item/cartridge/mob_hunt_game
cost = 2
/datum/gear/piano_synth
display_name ="synthesizer"
path = /obj/item/instrument/piano_synth
cost = 2
//////////////////////
// Mugs //
//////////////////////
@@ -197,3 +193,62 @@
display_name = "crewmember coffee mug"
description = "A crewmember's coffee mug, emblazoned in the colors of the Service department."
path = /obj/item/reagent_containers/food/drinks/mug/serv
//////////////////////
// Instruments //
//////////////////////
/datum/gear/instrument
display_name = "Synthesizer"
path = /obj/item/instrument/piano_synth
sort_category = "Instruments"
cost = 2
/datum/gear/instrument/accordion
display_name = "Accordion"
path = /obj/item/instrument/accordion
/datum/gear/instrument/banjo
display_name = "Banjo"
path = /obj/item/instrument/banjo
/datum/gear/instrument/eguitar
display_name = "Electric guitar"
path = /obj/item/instrument/eguitar
/datum/gear/instrument/glock
display_name = "Glockenspiel"
path = /obj/item/instrument/glockenspiel
/datum/gear/instrument/guitar
display_name = "Guitar"
path = /obj/item/instrument/guitar
/datum/gear/instrument/harmonica
display_name = "Harmonica"
path = /obj/item/instrument/harmonica
/datum/gear/instrument/recorder
display_name = "Recorder"
path = /obj/item/instrument/recorder
/datum/gear/instrument/sax
display_name = "Saxophone"
path = /obj/item/instrument/saxophone
/datum/gear/instrument/trumpet
display_name = "Trumpet"
path = /obj/item/instrument/trumpet
/datum/gear/instrument/trombone
display_name = "Trombone"
path = /obj/item/instrument/trombone
/datum/gear/instrument/violin
display_name = "Violin"
path = /obj/item/instrument/violin
/datum/gear/instrument/xylo
display_name = "Xylophone"
path = /obj/item/instrument/xylophone
@@ -362,7 +362,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
dat += "</td><td width='405px' height='200px' valign='top'>"
dat += "<h2>Occupation Choices</h2>"
dat += "<a href='?_src_=prefs;preference=job;task=menu'>Set Occupation Preferences</a><br>"
if(jobban_isbanned(user, "Records"))
if(jobban_isbanned(user, ROLEBAN_RECORDS))
dat += "<b>You are banned from using character records.</b><br>"
else
dat += "<a href=\"byond://?_src_=prefs;preference=records;record=1\">Character Records</a><br>"
@@ -495,7 +495,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
// RIGHT SIDE OF THE PAGE
dat += "</td><td width='300px' height='300px' valign='top'>"
dat += "<h2>Special Role Settings</h2>"
if(jobban_isbanned(user, "Syndicate"))
if(jobban_isbanned(user, ROLE_SYNDICATE))
dat += "<b>You are banned from special roles.</b>"
be_special = list()
else
+2 -2
View File
@@ -509,8 +509,8 @@
chameleon_action.emp_randomise(INFINITY)
/obj/item/storage/belt/chameleon
name = "toolbelt"
desc = "Holds tools."
name = "tool-belt"
desc = "Can hold various tools."
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/storage/belt/chameleon/Initialize(mapload)
+1 -1
View File
@@ -7,7 +7,7 @@
suit_adjusted = 1
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/reagent_containers/applicator,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser)
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/applicator, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser, /obj/item/robotanalyzer)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 50, "acid" = 50)
species_exception = list(/datum/species/golem)
sprite_sheets = list(
+1 -1
View File
@@ -73,7 +73,7 @@
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
if(H.mind && H.mind.assigned_role == "Clown")
GLOB.score_clownabuse++
SSticker.score.score_clown_abuse++
return ..()
/obj/item/clothing/under/rank/clown/sexy
+5 -1
View File
@@ -38,7 +38,11 @@
R.stamped += /obj/item/stamp
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)
var/obj/item/smallDelivery/D = new(get_turf(loc))
if(istype(loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = loc
if(H.back)
D.forceMove(H.back)
R.forceMove(D)
D.wrapped = R
D.name = "small parcel - 'EFTPOS access code'"
-7
View File
@@ -1,10 +1,3 @@
/datum/event/wallrot/setup()
announceWhen = rand(0, 300)
endWhen = announceWhen + 1
/datum/event/wallrot/announce()
GLOB.event_announcement.Announce("Harmful fungi detected on station. Station structures may be contaminated.", "Biohazard Alert")
/datum/event/wallrot/start()
INVOKE_ASYNC(src, .proc/spawn_wallrot)
@@ -12,7 +12,7 @@
var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets)
var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it
/obj/item/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target, mob/living/user, ranged = 0)
/obj/item/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target, mob/living/user, ranged = FALSE)
//Creates a shattering noise and replaces the bottle with a broken_bottle
var/new_location = get_turf(loc)
@@ -124,6 +124,11 @@
reagents.reaction(M, REAGENT_TOUCH)
reagents.clear_reagents()
/obj/item/reagent_containers/food/drinks/bottle/throw_impact(atom/target,mob/thrower)
..()
SplashReagents(target)
smash(target, thrower, ranged = TRUE)
/obj/item/reagent_containers/food/drinks/bottle/decompile_act(obj/item/matter_decompiler/C, mob/user)
if(!reagents.total_volume)
C.stored_comms["glass"] += 3
@@ -345,11 +350,10 @@
if(istype(R, A))
firestarter = 1
break
SplashReagents(target)
..()
if(firestarter && active)
target.fire_act()
new /obj/effect/hotspot(get_turf(target))
..()
/obj/item/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params)
if(is_hot(I) && !active)
@@ -89,3 +89,87 @@
if(ishuman(L))
shake_camera(L, 20, 1)
addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
/obj/item/wormhole_jaunter/contractor
name = "emergency extraction flare"
icon = 'icons/obj/lighting.dmi'
desc = "A single-use extraction flare that will let you create a portal to any beacon on the station. You must choose the destination beforehand, else it will target a random beacon. The portal is generated 5 seconds after activation, and has 1 use."
icon_state = "flare-contractor"
item_state = "flare"
var/destination
/obj/item/wormhole_jaunter/contractor/verb/set_destination()
set category = "Object"
set name = "Change Portal Destination"
set src in usr
var/list/L = list()
var/list/areaindex = list()
for(var/obj/item/radio/beacon/R in GLOB.beacons)
var/turf/T = get_turf(R)
if(!T)
continue
if(!is_teleport_allowed(T.z))
continue
var/tmpname = T.loc.name
if(areaindex[tmpname])
tmpname = "[tmpname] ([++areaindex[tmpname]])"
else
areaindex[tmpname] = 1
L[tmpname] = R
var/desc = input("Please select a location to target.", "Flare Target Interface") in L
destination = L[desc]
return
/obj/item/wormhole_jaunter/contractor/attack_self(mob/user) // message is later down
activate(user, TRUE)
/obj/item/wormhole_jaunter/contractor/activate(mob/user)
if(!turf_check(user))
return
if(!destination)
var/list/L = get_destinations(user)
if(!length(L))
to_chat(user, "<span class='warning'>[src] found no beacons in the sector to target.</span>")
return
destination = pick(L)
var/obj/effect/temp_visual/getaway_flare/F = new(get_turf(src))
user.visible_message("<span class='notice'>[user] pulls out a black and gold flare and lights it.</span>",\
"<span class='notice'>You light an emergency extraction flare, initiating the extraction process.</span>")
user.drop_item()
forceMove(F)
addtimer(CALLBACK(src, .proc/create_portal, destination), 5 SECONDS)
/obj/item/wormhole_jaunter/contractor/proc/create_portal(turf/destination)
new /obj/effect/decal/cleanable/ash(get_turf(src))
new /obj/effect/portal/redspace/getaway(get_turf(src), get_turf(destination), src, 100)
qdel(src)
/obj/item/wormhole_jaunter/contractor/emag_act(mob/user)
to_chat(user, "<span class='warning'>Emagging [src] has no effect.</span>")
/obj/item/wormhole_jaunter/contractor/chasm_react(mob/user)
return //This is not an instant getaway portal like the jaunter
/obj/item/storage/box/syndie_kit/escape_flare
name = "emergency extraction kit"
/obj/item/storage/box/syndie_kit/escape_flare/populate_contents()
new /obj/item/wormhole_jaunter/contractor(src)
new /obj/item/radio/beacon/emagged(src)
/obj/effect/portal/redspace/getaway
one_use = TRUE
/obj/effect/temp_visual/getaway_flare // Because the original contractor flare is not a temp visual, for some reason.
name = "contractor extraction flare"
icon = 'icons/obj/lighting.dmi'
icon_state = "flare-contractor-on"
duration = 5.1 SECONDS // Needs to be slightly longer then the callback to make the portal
/obj/effect/temp_visual/getaway_flare/Initialize()
. = ..()
playsound(loc, 'sound/goonstation/misc/matchstick_light.ogg', 50, TRUE)
set_light(8, l_color = "#FFD165")
@@ -381,7 +381,6 @@
damage_type = BRUTE
hitsound = 'sound/effects/splat.ogg'
weaken = 3
var/chain
/obj/item/projectile/hook/fire(setAngle)
if(firer)
@@ -12,7 +12,7 @@
desc = "It's watching you suspiciously."
/obj/structure/closet/crate/necropolis/tendril/populate_contents()
var/loot = rand(1, 27)
var/loot = rand(1, 26)
switch(loot)
if(1)
new /obj/item/shared_storage/red(src)
@@ -44,38 +44,36 @@
if(12)
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/berserker(src)
if(13)
new /obj/item/jacobs_ladder(src)
if(14)
new /obj/item/nullrod/scythe/talking(src)
if(15)
if(14)
new /obj/item/nullrod/armblade/mining(src)
if(16)
if(15)
new /obj/item/guardiancreator(src)
if(17)
if(16)
if(prob(50))
new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src)
else
new /obj/item/disk/design_disk/modkit_disc/bounty(src)
if(18)
if(17)
new /obj/item/warp_cube/red(src)
if(19)
if(18)
new /obj/item/wisp_lantern(src)
if(20)
if(19)
new /obj/item/immortality_talisman(src)
if(21)
if(20)
new /obj/item/gun/magic/hook(src)
if(22)
if(21)
new /obj/item/voodoo(src)
if(23)
if(22)
new /obj/item/grenade/clusterbuster/inferno(src)
if(24)
if(23)
new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src)
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src)
if(25)
if(24)
new /obj/item/spellbook/oneuse/summonitem(src)
if(26)
if(25)
new /obj/item/book_of_babel(src)
if(27)
if(26)
new /obj/item/borg/upgrade/modkit/lifesteal(src)
new /obj/item/bedsheet/cult(src)
+1 -1
View File
@@ -19,7 +19,7 @@
pixel_x = rand(0, 16) - 8
pixel_y = rand(0, 8) - 8
if(is_mining_level(z))
GLOB.score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining level (No Clown Planet)
SSticker.score.score_ore_mined++ //When ore spawns, increment score. Only include ore spawned on mining level (No Clown Planet)
/obj/item/stack/ore/welder_act(mob/user, obj/item/I)
. = TRUE
+15 -9
View File
@@ -360,20 +360,21 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!client)
return
var/mob/dead/observer/M = src
if(jobban_isbanned(M, "AntagHUD"))
if(jobban_isbanned(M, ROLEBAN_AHUD))
to_chat(src, "<span class='danger'>You have been banned from using this feature</span>")
return
if(GLOB.configuration.general.restrict_antag_hud_rejoin && !M.has_enabled_antagHUD && !check_rights(R_ADMIN|R_MOD,0))
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No")
if(response == "No") return
M.can_reenter_corpse = 0
var/restricted_use = (!M.has_enabled_antagHUD && !check_rights(R_ADMIN|R_MOD, FALSE)) // Admins can freely toggle it
if(GLOB.configuration.general.restrict_antag_hud_rejoin && restricted_use)
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.", "Are you sure you want to turn this feature on?", "Yes", "No")
if(response == "No")
return
M.can_reenter_corpse = FALSE
if(M in GLOB.respawnable_list)
GLOB.respawnable_list -= M
if(!M.has_enabled_antagHUD && !check_rights(R_ADMIN|R_MOD,0))
M.has_enabled_antagHUD = 1
//var/datum/atom_hud/A = huds[DATA_HUD_SECURITY_ADVANCED]
//var/adding_hud = (usr in A.hudusers) ? 0 : 1
if(restricted_use)
M.has_enabled_antagHUD = TRUE
for(var/datum/atom_hud/antag/H in (GLOB.huds))
if(!M.antagHUD)
@@ -382,9 +383,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
H.remove_hud_from(usr)
if(!M.antagHUD)
to_chat(usr, "AntagHud Toggled ON")
create_log(MISC_LOG, "Enabled AntagHUD")
log_game("[key_name(usr)] has enabled AntagHUD.")
M.antagHUD = TRUE
else
to_chat(usr, "AntagHud Toggled OFF")
create_log(MISC_LOG, "Disabled AntagHUD")
log_game("[key_name(usr)] has disabled AntagHUD.")
M.antagHUD = FALSE
/mob/dead/observer/verb/set_dnr()
@@ -407,6 +412,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/choice = alert(src, "If you enable this, your body will be unrevivable for the remainder of the round.", "Are you sure?", "Yes", "No")
if(choice == "Yes")
to_chat(src, "<span class='boldnotice'>Do Not Revive state enabled.</span>")
create_log(MISC_LOG, "DNR Enabled")
can_reenter_corpse = FALSE
if(!QDELETED(mind.current)) // Could change while they're choosing
mind.current.med_hud_set_status()
@@ -64,7 +64,7 @@
/obj/item/mmi/robotic_brain/proc/check_observer(mob/dead/observer/O)
if(cannotPossess(O))
return FALSE
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O, "nonhumandept"))
return FALSE
if(!O.can_reenter_corpse)
return FALSE
@@ -160,7 +160,7 @@
if(cannotPossess(O))
to_chat(O, "<span class='warning'>Upon using the antagHUD you forfeited the ability to join the round.</span>")
return
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O, "nonhumandept"))
to_chat(O, "<span class='warning'>You are job banned from this role.</span>")
return
to_chat(O, "<span class='notice'>You've been added to the list of ghosts that may become this [src]. Click again to unvolunteer.</span>")
+1 -1
View File
@@ -1042,7 +1042,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven
if(!forceFed(toEat, user, fullness))
return 0
consume(toEat, bitesize_override, can_taste_container = toEat.can_taste)
GLOB.score_foodeaten++
SSticker.score.score_food_eaten++
return 1
/mob/living/carbon/proc/selfFeed(obj/item/reagent_containers/food/toEat, fullness)
@@ -332,9 +332,6 @@
else if(!client)
msg += "[p_they(TRUE)] [p_have()] suddenly fallen asleep, suffering from Space Sleep Disorder. [p_they(TRUE)] may wake up soon.\n"
if(digitalcamo)
msg += "[p_they(TRUE)] [p_are()] moving [p_their()] body in an unnatural and blatantly inhuman manner.\n"
if(!(skipface || ( wear_mask && ( wear_mask.flags_inv & HIDEFACE || wear_mask.flags_cover & MASKCOVERSMOUTH) ) ) && is_thrall(src) && in_range(user,src))
msg += "Their features seem unnaturally tight and drawn.\n"
+11 -4
View File
@@ -1163,6 +1163,10 @@
set src in view(1)
var/self = 0
if (!ishuman(src))
to_chat(usr, "<span class='notice'>You do not know how to check someone's pulse!</span>")
return
if(usr.stat == 1 || usr.restrained() || !isliving(usr) || usr.is_dead()) return
if(usr == src)
@@ -1192,8 +1196,10 @@
/mob/living/carbon/human/proc/change_dna(datum/dna/new_dna, include_species_change = FALSE, keep_flavor_text = FALSE)
if(include_species_change)
set_species(new_dna.species.type, retain_damage = TRUE)
set_species(new_dna.species.type, retain_damage = TRUE, transformation = TRUE)
dna = new_dna.Clone()
if (include_species_change) //We have to call this after new_dna.Clone() so that species actions don't get overwritten
dna.species.on_species_gain(src)
real_name = new_dna.real_name
domutcheck(src, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
if(!keep_flavor_text)
@@ -1205,7 +1211,7 @@
sec_hud_set_ID()
/mob/living/carbon/human/proc/set_species(datum/species/new_species, default_colour, delay_icon_update = FALSE, skip_same_check = FALSE, retain_damage = FALSE)
/mob/living/carbon/human/proc/set_species(datum/species/new_species, default_colour, delay_icon_update = FALSE, skip_same_check = FALSE, retain_damage = FALSE, transformation = FALSE)
if(!skip_same_check)
if(dna.species.name == initial(new_species.name))
return
@@ -1362,7 +1368,8 @@
dna.real_name = real_name
dna.species.on_species_gain(src)
if (!transformation) //Distinguish between creating a mob and switching species
dna.species.on_species_gain(src)
update_sight()
@@ -1737,7 +1744,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
if(G.trigger_guard == TRIGGER_GUARD_NORMAL)
if(HAS_TRAIT(src, TRAIT_CHUNKYFINGERS))
to_chat(src, "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>")
to_chat(src, "<span class='warning'>Your meaty finger is far too large for the trigger guard!</span>")
return FALSE
if(mind && mind.martial_art && mind.martial_art.no_guns) //great dishonor to famiry
@@ -16,6 +16,8 @@
var/relay_speech = FALSE
var/use_static = TRUE
var/static_visibility_range = 16
// Decides if it is shown by AI Detector or not
var/ai_detector_visible = TRUE
// Use this when setting the aiEye's location.
@@ -368,7 +368,7 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
//question(O.client)
/datum/paiController/proc/check_recruit(mob/dead/observer/O)
if(jobban_isbanned(O, ROLE_PAI) || jobban_isbanned(O,"nonhumandept"))
if(jobban_isbanned(O, ROLE_PAI) || jobban_isbanned(O, "nonhumandept"))
return 0
if(!player_old_enough_antag(O.client,ROLE_PAI))
return 0
@@ -1189,12 +1189,13 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
var/floor_only = TRUE
for(var/A in tile)
if(istype(A, /obj/effect))
if(is_cleanable(A))
var/obj/effect/decal/cleanable/blood/B = A
var/obj/effect/E = A
if(E.is_cleanable())
var/obj/effect/decal/cleanable/blood/B = E
if(istype(B) && B.off_floor)
floor_only = FALSE
else
qdel(A)
qdel(E)
else if(istype(A, /obj/item))
var/obj/item/cleaned_item = A
cleaned_item.clean_blood()
@@ -551,7 +551,7 @@
/obj/item/robot_module/miner/handle_custom_removal(component_id, mob/living/user, obj/item/W)
if(component_id == "KA modkits")
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/D in src)
D.attackby(W, user)
D.crowbar_act(user, W)
return TRUE
return ..()
@@ -9,7 +9,7 @@
outfit = /datum/outfit/syndicatesoldiercorpse
/datum/outfit/syndicatesoldiercorpse
name = "Syndicate Operative Corpse"
name = "Corpse of a Syndicate Operative"
uniform = /obj/item/clothing/under/syndicate
suit = /obj/item/clothing/suit/armor/vest
shoes = /obj/item/clothing/shoes/combat
@@ -31,7 +31,7 @@
outfit = /datum/outfit/syndicatecommandocorpse
/datum/outfit/syndicatecommandocorpse
name = "Syndicate Commando Corpse"
name = "Corpse of a Syndicate Commando"
uniform = /obj/item/clothing/under/syndicate
suit = /obj/item/clothing/suit/space/hardsuit/syndi
shoes = /obj/item/clothing/shoes/combat
@@ -59,7 +59,7 @@
outfit = /datum/outfit/piratecorpse
/datum/outfit/piratecorpse
name = "Pirate Corpse"
name = "Corpse of a Pirate"
uniform = /obj/item/clothing/under/pirate
shoes = /obj/item/clothing/shoes/jackboots
glasses = /obj/item/clothing/glasses/eyepatch
@@ -72,7 +72,7 @@
outfit = /datum/outfit/piratecorpse/ranged
/datum/outfit/piratecorpse/ranged
name = "Pirate Gunner Corpse"
name = "Corpse of a Pirate Gunner"
suit = /obj/item/clothing/suit/pirate_black
head = /obj/item/clothing/head/pirate
@@ -85,7 +85,7 @@
outfit = /datum/outfit/russiancorpse
/datum/outfit/russiancorpse
name = "Russian Corpse"
name = "Corpse of a Russian"
uniform = /obj/item/clothing/under/soviet
shoes = /obj/item/clothing/shoes/jackboots
head = /obj/item/clothing/head/bearpelt
@@ -95,12 +95,12 @@
outfit = /datum/outfit/russiancorpse/ranged
/datum/outfit/russiancorpse/ranged
name = "Ranged Russian Corpse"
name = "Corpse of a Ranged Russian"
head = /obj/item/clothing/head/ushanka
/obj/effect/mob_spawn/human/corpse/wizard
name = "Space Wizard Corpse"
name = "Corpse of a Space Wizard"
outfit = /datum/outfit/wizardcorpse
/obj/effect/mob_spawn/human/corpse/clownoff/Initialize(mapload)
@@ -108,7 +108,7 @@
. = ..()
/datum/outfit/wizardcorpse
name = "Space Wizard Corpse"
name = "Corpse of a Space Wizard"
uniform = /obj/item/clothing/under/color/lightpurple
suit = /obj/item/clothing/suit/wizrobe
shoes = /obj/item/clothing/shoes/sandal
@@ -189,7 +189,7 @@ Difficulty: Very Hard
var/turf/target_turf = get_turf(target)
playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 2)
newtonian_move(get_dir(target_turf, src))
var/angle_to_target = Get_Angle(src, target_turf)
var/angle_to_target = get_angle(src, target_turf)
if(isnum(set_angle))
angle_to_target = set_angle
var/static/list/colossus_shotgun_shot_angles = list(12.5, 7.5, 2.5, -2.5, -7.5, -12.5)
@@ -28,8 +28,8 @@
error_on_humanize = "Dead spiders are not player-controllable."
else if(!(user in GLOB.respawnable_list))
error_on_humanize = "You are not able to rejoin the round."
if(jobban_isbanned(user, "Syndicate") || jobban_isbanned(user, "alien"))
to_chat(user,"You are jobbanned from role of syndicate and/or alien lifeform.")
if(jobban_isbanned(user, ROLE_SYNDICATE) || jobban_isbanned(user, ROLE_TSPIDER))
to_chat(user, "<span class='warning'>You are jobbanned from role of syndicate and/or terror spider.</span>")
return
if(error_on_humanize == "")
var/spider_ask = alert(humanize_prompt, "Join as Terror Spider?", "Yes", "No")
@@ -689,18 +689,25 @@
clean_speak = list(
"Poly wanna cracker!",
"Check the crystal, you chucklefucks!",
"Check the tesla, you shits!",
"STOP HOT-WIRING THE ENGINE, FUCKING CHRIST!",
"Wire the solars, you lazy bums!",
"WHO TOOK THE DAMN HARDSUITS?",
"OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE",
"Why are there so many atmos alerts?",
"OH GOD WHY WOULD YOU PUT CARBON-DIOXIDE IN THE SM?",
"OH GOD WHY WOULD YOU PUT PLASMA IN THE SM?",
"Remember to lock the emitters!",
"Stop goofing off and repair the goddam station!",
"The supermatter is not your friend!",
"What were the wires again?",
"Goddam emaggers!"
"Goddam emaggers!",
"Why is nobody watching the engine?",
"Maybe the SM would produce more power if we fed it some clowns.",
"Everyone else dusted when they touched the SM, but I am sure you will be different.",
"I asked the mime if they turned off the scrubbers, but they didn't say a word.",
"This engine setup meets all safety requirements.",
"Chief Engineers are the SM's natural diet.",
"Don't eat the forbidden nacho!",
"Is the engine meant to be making that noise?",
)
unique_pet = TRUE
gold_core_spawnable = NO_SPAWN
@@ -708,6 +715,7 @@
/mob/living/simple_animal/parrot/Poly/New()
ears = new /obj/item/radio/headset/headset_eng(src)
available_channels = list(":e")
clean_speak += "Danger! Crystal hyperstructure integrity faltering! Integrity: [rand(75, 99)]%" // Has to be here cause of the `rand()`.
..()
/mob/living/simple_animal/parrot/handle_message_mode(message_mode, list/message_pieces, verb, used_radios)
+2 -1
View File
@@ -890,7 +890,8 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
if(href_list["flavor_change"])
update_flavor_text()
return
if(href_list["scoreboard"])
usr << browse(GLOB.scoreboard, "window=roundstats;size=500x600")
// The src mob is trying to strip an item from someone
// Defined in living.dm
+1 -1
View File
@@ -299,7 +299,7 @@
if(ispath(MP, /mob/living/simple_animal/butterfly))
return 1
if(ispath(MP, /mob/living/simple_animal/borer) && !jobban_isbanned(src, ROLE_BORER) && !jobban_isbanned(src, "Syndicate"))
if(ispath(MP, /mob/living/simple_animal/borer) && !jobban_isbanned(src, ROLE_BORER) && !jobban_isbanned(src, ROLE_SYNDICATE))
return 1
if(ispath(MP, /mob/living/simple_animal/diona) && !jobban_isbanned(src, ROLE_NYMPH))
+2 -1
View File
@@ -137,7 +137,6 @@
*/
/obj/item/pen/edagger
origin_tech = "combat=3;syndicate=1"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off
var/on = 0
var/brightness_on = 2
light_color = LIGHT_COLOR_RED
@@ -149,6 +148,7 @@
sharp = 0
w_class = initial(w_class)
name = initial(name)
attack_verb = list()
hitsound = initial(hitsound)
embed_chance = initial(embed_chance)
throwforce = initial(throwforce)
@@ -161,6 +161,7 @@
sharp = 1
w_class = WEIGHT_CLASS_NORMAL
name = "energy dagger"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
hitsound = 'sound/weapons/blade1.ogg'
embed_chance = 100 //rule of cool
throwforce = 35
+3 -3
View File
@@ -113,6 +113,7 @@
updateUsrDialog()
else if(check_ass())
to_chat(ass, "<span class='notice'>You feel a slight pressure on your ass.</span>")
atom_say("Attention: Unable to remove large object!")
updateUsrDialog()
else if(href_list["min"])
if(copies > 1)
@@ -240,6 +241,7 @@
var/icon/temp_img
if(!check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on.
return
atom_say("Attention: Posterior Placed on Printing Plaque!")
if(emagged)
if(ishuman(ass))
var/mob/living/carbon/human/H = ass
@@ -314,7 +316,6 @@
toner = 0
/obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user)
check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off.
if(!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai) || target == ass)
return
src.add_fingerprint(user)
@@ -332,7 +333,7 @@
copyitem = null
updateUsrDialog()
/obj/machinery/photocopier/proc/check_ass() //I'm not sure wether I made this proc because it's good form or because of the name.
/obj/machinery/photocopier/proc/check_ass() //I'm not sure whether I made this proc because it's good form or because of the name.
if(!ass)
return 0
if(ass.loc != src.loc)
@@ -341,7 +342,6 @@
return 0
else
playsound(loc, 'sound/machines/ping.ogg', 50, 0)
atom_say("Attention: Posterior Placed on Printing Plaque!")
return 1
/obj/machinery/photocopier/emag_act(user as mob)
+6 -2
View File
@@ -105,6 +105,8 @@
var/global/list/status_overlays_environ
var/indestructible = 0 // If set, prevents aliens from destroying it
var/keep_preset_name = 0
/// Was this APC built instead of already existing? Used for malfhack to keep borgs from building apcs in space
var/constructed = FALSE
var/report_power_alarm = TRUE
@@ -171,14 +173,13 @@
operating = 0
name = "[area.name] APC"
stat |= MAINT
constructed = TRUE
update_icon()
addtimer(CALLBACK(src, .proc/update), 5)
/obj/machinery/power/apc/Destroy()
SStgui.close_uis(wires)
GLOB.apcs -= src
if(malfai && operating)
malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000)
area.power_light = 0
area.power_equip = 0
area.power_environ = 0
@@ -973,6 +974,9 @@
if(malf.malfhacking)
to_chat(malf, "You are already hacking an APC.")
return
if(constructed)
to_chat(malf, "<span class='warning'>This APC was only recently constructed, and is not fully linked to station systems. Hacking it would be pointless.</span>")
return
to_chat(malf, "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process.")
malf.malfhack = src
malf.malfhacking = addtimer(CALLBACK(malf, /mob/living/silicon/ai/.proc/malfhacked, src), 600, TIMER_STOPPABLE)
+6
View File
@@ -354,3 +354,9 @@
desc = "A standard ninja-suit power cell."
maxcharge = 10000
materials = list(MAT_GLASS = 60)
/obj/item/stock_parts/cell/bsg
name = "\improper B.S.G power cell"
desc = "A high capacity, slow charging cell for the B.S.G."
maxcharge = 40000
chargerate = 2600 // about 30 seconds to charge with a default recharger
+1 -1
View File
@@ -578,7 +578,7 @@
if(prot > 0 || HAS_TRAIT(user, TRAIT_RESISTHEAT) || HAS_TRAIT(user, TRAIT_RESISTHEATHANDS))
to_chat(user, "<span class='notice'>You remove the light [fitting]</span>")
else if(user.dna?.GetSEState(GLOB.teleblock))
else if(HAS_TRAIT(user, TRAIT_TELEKINESIS))
to_chat(user, "<span class='notice'>You telekinetically remove the light [fitting].</span>")
else
if(user.a_intent == INTENT_DISARM || user.a_intent == INTENT_GRAB)
@@ -116,7 +116,7 @@
// it might mean we are stuck in a corner somewere. So move around to try to expand.
move()
if(current_size >= STAGE_TWO)
radiation_pulse(src, min(5000, (energy * 4.5) + 1000), RAD_DISTANCE_COEFFICIENT * 0.5)
radiation_pulse(src, min(5000, (energy * 4.5) + 1000), RAD_DISTANCE_COEFFICIENT * 0.1)
if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit
event()
eat()
+5 -5
View File
@@ -101,7 +101,7 @@
overlays += image('icons/obj/power.dmi', icon_state = "solar_panel-b", layer = FLY_LAYER)
else
overlays += image('icons/obj/power.dmi', icon_state = "solar_panel", layer = FLY_LAYER)
src.dir = angle2dir(adir)
set_angle(adir)
return
//calculates the fraction of the sunlight that the panel recieves
@@ -298,7 +298,7 @@
if(autostart)
search_for_connected()
if(connected_tracker && track == TRACKER_AUTO)
connected_tracker.set_angle(SSsun.angle)
connected_tracker.modify_angle(SSsun.angle)
set_panels(cdir)
/obj/machinery/power/solar_control/Destroy()
@@ -338,7 +338,7 @@
return
if(track == TRACKER_AUTO && connected_tracker) // auto-tracking
connected_tracker.set_angle(SSsun.angle)
connected_tracker.modify_angle(SSsun.angle)
set_panels(cdir)
updateDialog()
@@ -410,7 +410,7 @@
track = text2num(params["track"])
if(track == TRACKER_AUTO)
if(connected_tracker)
connected_tracker.set_angle(SSsun.angle)
connected_tracker.modify_angle(SSsun.angle)
set_panels(cdir)
else if(track == TRACKER_TIMED)
targetdir = cdir
@@ -420,7 +420,7 @@
if("refresh")
search_for_connected()
if(connected_tracker && track == TRACKER_AUTO)
connected_tracker.set_angle(SSsun.angle)
connected_tracker.modify_angle(SSsun.angle)
set_panels(cdir)
/obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params)
+1 -1
View File
@@ -50,7 +50,7 @@
update_icon()
//updates the tracker icon and the facing angle for the control computer
/obj/machinery/power/tracker/proc/set_angle(angle)
/obj/machinery/power/tracker/proc/modify_angle(angle)
sun_angle = angle
//set icon dir to show sun illumination
@@ -271,6 +271,16 @@
delay = 50
select_name = "snipe"
/obj/item/ammo_casing/energy/bsg
projectile_type = /obj/item/projectile/energy/bsg
muzzle_flash_color = LIGHT_COLOR_DARKBLUE
muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG
fire_sound = 'sound/weapons/wave.ogg'
e_cost = 10000
select_name = "the experimental setting"
delay = 10 SECONDS //Looooooong cooldown
/obj/item/ammo_casing/energy/teleport
projectile_type = /obj/item/projectile/energy/teleport
muzzle_flash_color = LIGHT_COLOR_LIGHTBLUE
+2
View File
@@ -17,6 +17,8 @@
var/selfcharge = 0
var/charge_tick = 0
var/charge_delay = 4
/// Do you want the gun to fit into a turret, defaults to true, used for if a energy gun is too strong to be in a turret, or does not make sense to be in one.
var/can_fit_in_turrets = TRUE
/obj/item/gun/energy/emp_act(severity)
cell.use(round(cell.charge / severity))
@@ -275,7 +275,7 @@
return ..()
/obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R)
if(..())
if(!..())
return
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules)
@@ -317,6 +317,121 @@
zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you.
shaded_charge = 1
/obj/item/gun/energy/bsg
name = "\improper B.S.G"
desc = "The Blue Space Gun. Uses a flux anomaly core and a bluespace crystal to produce destructive bluespace energy blasts, inspired by Nanotrasen's BSA division."
icon_state = "bsg"
item_state = "bsg"
origin_tech = "combat=6;materials=6;powerstorage=6;bluespace=6;magnets=6" //cutting edge technology, be my guest if you want to deconstruct one instead of use it.
ammo_type = list(/obj/item/ammo_casing/energy/bsg)
weapon_weight = WEAPON_HEAVY
w_class = WEIGHT_CLASS_HUGE
can_holster = FALSE
slot_flags = SLOT_BACK
cell_type = /obj/item/stock_parts/cell/bsg
shaded_charge = TRUE
can_fit_in_turrets = FALSE //Crystal would shatter, or someone would try to put an empty gun in the frame.
var/obj/item/assembly/signaler/anomaly/flux/core = null
var/has_bluespace_crystal = FALSE
var/admin_model = FALSE //For the admin gun, prevents crystal shattering, so anyone can use it, and you dont need to carry backup crystals.
/obj/item/gun/energy/bsg/Destroy()
QDEL_NULL(core)
return ..()
/obj/item/gun/energy/bsg/examine(mob/user)
. = ..()
if(core && has_bluespace_crystal)
. += "<span class='notice'>[src] is fully operational!</span>"
else if(core)
. += "<span class='warning'>It has a flux anomaly core installed, but no bluespace crystal installed.</span>"
else if(has_bluespace_crystal)
. += "<span class='warning'>It has a bluespace crystal installed, but no flux anomaly core installed.</span>"
else
. += "<span class='warning'>It is missing a flux anomaly core and bluespace crystal to be operational.</span>"
/obj/item/gun/energy/bsg/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/stack/ore/bluespace_crystal))
if(has_bluespace_crystal)
to_chat(user, "<span class='notice'>[src] already has a bluespace crystal installed.</span>")
return
var/obj/item/stack/S = O
if(!loc || !S || S.get_amount() < 1)
return
to_chat(user, "<span class='notice'>You load [O] into [src].</span>")
S.use(1)
has_bluespace_crystal = TRUE
update_icon()
return
if(istype(O, /obj/item/assembly/signaler/anomaly/flux))
if(core)
to_chat(user, "<span class='notice'>[src] already has a [O]!</span>")
return
if(!user.drop_item())
to_chat(user, "<span class='warning'>[O] is stuck to your hand!</span>")
return
to_chat(user, "<span class='notice'>You insert [O] into [src], and [src] starts to warm up.</span>")
O.forceMove(src)
core = O
update_icon()
else
return ..()
/obj/item/gun/energy/bsg/process_fire(atom/target, mob/living/user, message = TRUE, params, zone_override, bonus_spread = 0)
if(!has_bluespace_crystal)
to_chat(user, "<span class='warning'>[src] has no bluespace crystal to power it!</span>")
return
if(!core)
to_chat(user, "<span class='warning'>[src] has no flux anomaly core to power it!</span>")
return
return ..()
/obj/item/gun/energy/bsg/process_chamber()
if(prob(25))
shatter()
..()
update_icon()
/obj/item/gun/energy/bsg/update_icon()
. = ..()
if(core)
if(has_bluespace_crystal)
icon_state = "bsg_finished"
else
icon_state = "bsg_core"
else if(has_bluespace_crystal)
icon_state = "bsg_crystal"
else
icon_state = "bsg"
/obj/item/gun/energy/bsg/emp_act(severity)
..()
if(prob(75 / severity))
if(has_bluespace_crystal)
shatter()
/obj/item/gun/energy/bsg/proc/shatter()
if(admin_model)
return
visible_message("<span class='warning'>[src]'s bluespace crystal shatters!</span>")
playsound(src, 'sound/effects/pylon_shatter.ogg', 50, TRUE)
has_bluespace_crystal = FALSE
update_icon()
/obj/item/gun/energy/bsg/prebuilt
icon_state = "bsg_finished"
has_bluespace_crystal = TRUE
/obj/item/gun/energy/bsg/prebuilt/Initialize(mapload)
. = ..()
core = new /obj/item/assembly/signaler/anomaly/flux
update_icon()
/obj/item/gun/energy/bsg/prebuilt/admin
desc = "The Blue Space Gun. Uses a flux anomaly core and a bluespace crystal to produce destructive bluespace energy blasts, inspired by Nanotrasen's BSA division. This is an executive model, and its bluespace crystal will not shatter."
admin_model = TRUE
// Temperature Gun //
/obj/item/gun/energy/temperature
name = "temperature gun"
+4 -1
View File
@@ -60,6 +60,9 @@
var/log_override = FALSE //whether print to admin attack logs or just keep it in the diary
/// For when you want your projectile to have a chain coming out of the gun
var/chain = null
/obj/item/projectile/New()
permutated = list()
return ..()
@@ -239,7 +242,7 @@
if((!current || loc == current))
current = locate(clamp(x + xo, 1, world.maxx), clamp(y + yo, 1, world.maxy), z)
if(isnull(Angle))
Angle = round(Get_Angle(src, current))
Angle = round(get_angle(src, current))
if(spread)
Angle += (rand() - 0.5) * spread
var/matrix/M = new
+56 -1
View File
@@ -80,7 +80,6 @@
var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE
var/zap_range = 3
var/power = 10000
var/chain
/obj/item/ammo_casing/energy/shock_revolver/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
..()
@@ -93,6 +92,62 @@
tesla_zap(src, zap_range, power, zap_flags)
qdel(src)
/obj/item/projectile/energy/bsg
name = "orb of pure bluespace energy"
icon_state = "bluespace"
impact_effect_type = /obj/effect/temp_visual/bsg_kaboom
damage = 60
damage_type = BURN
range = 9
weaken = 1 //This is going to knock you off your feet
eyeblur = 5
speed = 2
alwayslog = TRUE
/obj/item/ammo_casing/energy/bsg/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
..()
var/obj/item/projectile/energy/bsg/P = BB
addtimer(CALLBACK(P, /obj/item/projectile/energy/bsg/.proc/make_chain, P, user), 1)
/obj/item/projectile/energy/bsg/proc/make_chain(obj/item/projectile/P, mob/user)
P.chain = P.Beam(user, icon_state = "sm_arc_supercharged", icon = 'icons/effects/beam.dmi', time = 10 SECONDS, maxdistance = 30)
/obj/item/projectile/energy/bsg/on_hit(atom/target)
. = ..()
kaboom()
qdel(src)
/obj/item/projectile/energy/bsg/on_range()
kaboom()
new /obj/effect/temp_visual/bsg_kaboom(loc)
..()
/obj/item/projectile/energy/bsg/proc/kaboom()
playsound(src, 'sound/weapons/bsg_explode.ogg', 75, TRUE)
for(var/mob/living/M in hearers(7, src)) //No stuning people with thermals through a wall.
var/floored = FALSE
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/gun/energy/bsg/N = locate() in H
if(N)
to_chat(H, "<span class='notice'>[N] deploys an energy shield to project you from [src]'s explosion.</span>")
continue
var/distance = (1 + get_dist(M, src))
if(prob(min(400 / distance, 100))) //100% chance to hit with the blast up to 3 tiles, after that chance to hit is 80% at 4 tiles, 66.6% at 5, 57% at 6, and 50% at 7
if(prob(min(150 / distance, 100)))//100% chance to upgraded to a stun as well at a direct hit, 75% at 1 tile, 50% at 2, 37.5% at 3, 30% at 4, 25% at 5, 21% at 6, and finaly 19% at 7. This is calculated after the first hit however.
floored = TRUE
M.apply_damage((rand(15, 30) * (1.1 - distance / 10)), BURN) //reduced by 10% per tile
add_attack_logs(src, M, "Hit heavily by [src]")
if(floored)
to_chat(M, "<span class='userdanger'>You see a flash of briliant blue light as [src] explodes, knocking you to the ground and burning you!</span>")
M.Weaken(1)
else
to_chat(M, "<span class='userdanger'>You see a flash of briliant blue light as [src] explodes, burning you!</span>")
else
to_chat(M, "<span class='userdanger'>You feel the heat of the explosion of [src], but the blast mostly misses you.</span>")
add_attack_logs(src, M, "Hit lightly by [src]")
M.apply_damage(rand(1, 5), BURN)
/obj/item/projectile/energy/toxplasma
name = "plasma bolt"
icon_state = "energy"
@@ -246,7 +246,7 @@
if(!operating)
for (var/obj/item/O in holdingitems)
processing_chamber += "\A [O.name]<BR>"
processing_chamber += "\A [html_encode(O.name)]<BR>"
if (!processing_chamber)
is_chamber_empty = 1
@@ -688,6 +688,25 @@
M.bodytemperature = min(330, M.bodytemperature + (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
return ..()
/datum/reagent/consumable/ethanol/adminfreeze
name = "Admin Freeze"
id = "adminfreeze"
description = "Ultimate Punishment."
reagent_state = LIQUID
color = "#30F0FF" // rgb: 048, 240, 255
dizzy_adj = 4
alcohol_perc = 1.5 // oof
drink_icon = "adminfreeze"
drink_name = "Admin Freeze"
drink_desc = "The ultimate punishment."
taste_description = "a series of bad decisions"
/datum/reagent/consumable/ethanol/adminfreeze/reaction_mob(mob/living/M, method = REAGENT_INGEST, volume)
..()
if(method == REAGENT_INGEST)
M.apply_status_effect(/datum/status_effect/freon/watcher)
M.adjust_bodytemperature(-110)
/datum/reagent/consumable/ethanol/barefoot
name = "Barefoot"
id = "barefoot"
@@ -442,7 +442,7 @@
if(!istype(C))
return
if(C.mind)
if(C.mind.assigned_role == "Clown" || C.mind.assigned_role == SPECIAL_ROLE_HONKSQUAD)
if(C.mind.assigned_role == "Clown")
to_chat(C, "<span class='notice'>Whatever that was, it feels great!</span>")
else if(C.mind.assigned_role == "Mime")
to_chat(C, "<span class='warning'>You feel nauseous.</span>")
@@ -460,7 +460,7 @@
var/update_flags = STATUS_UPDATE_NONE
if(prob(10))
M.emote("giggle")
if(M?.mind.assigned_role == "Clown" || M?.mind.assigned_role == SPECIAL_ROLE_HONKSQUAD)
if(M?.mind.assigned_role == "Clown")
update_flags |= M.adjustBruteLoss(-1.5 * REAGENTS_EFFECT_MULTIPLIER) //Screw those pesky clown beatings!
else
M.AdjustDizzy(10, 0, 500)
@@ -57,10 +57,12 @@
taste_description = "floor cleaner"
/datum/reagent/space_cleaner/reaction_obj(obj/O, volume)
if(is_cleanable(O))
var/obj/effect/decal/cleanable/blood/B = O
if(!(istype(B) && B.off_floor))
qdel(O)
if(istype(O, /obj/effect))
var/obj/effect/E = O
if(E.is_cleanable())
var/obj/effect/decal/cleanable/blood/B = E
if(!(istype(B) && B.off_floor))
qdel(E)
else
if(O.simulated)
O.color = initial(O.color)
@@ -443,6 +443,15 @@
result_amount = 4
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
/datum/chemical_reaction/adminfreeze
name = "Admin Freeze"
id = "adminfreeze"
result = "adminfreeze"
required_reagents = list("neurotoxin" = 1, "toxinsspecial" = 1, "fernet" = 1, "moonshine" = 1, "morphine" = 1)
min_temp = T0C + 100
result_amount = 5
mix_sound = 'sound/effects/adminhelp.ogg'
/datum/chemical_reaction/barefoot
name = "Barefoot"
id = "barefoot"
@@ -18,7 +18,8 @@
return FALSE
bitesize = 0
if(M.eat(src, user))
user.drop_item()
if(user.get_active_hand() == src)
user.drop_item() // Only drop if they're holding the patch directly
forceMove(M)
LAZYADD(M.processing_patches, src)
return TRUE
@@ -4,6 +4,8 @@
icon = 'icons/obj/abductor.dmi'
icon_state = "camera_target"
var/allowed_area = null
// The Xenobio Console does not trigger the AI Detector
ai_detector_visible = FALSE
/mob/camera/aiEye/remote/xenobio/New(loc)
var/area/A = get_area(loc)
@@ -194,7 +194,7 @@
/obj/structure/puzzle_element
name = "mysterious pillar"
desc = "puzzling..."
desc = "Puzzling..."
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "puzzle_pillar"
anchored = FALSE
@@ -264,6 +264,8 @@
visible_icon = FALSE
use_static = FALSE
simulated = FALSE
// The Shuttle Docker does not trigger the AI Detector
ai_detector_visible = FALSE
var/list/placement_images = list()
var/list/placed_images = list()
+3 -2
View File
@@ -64,8 +64,9 @@
/obj/item/organ/internal/heart/prepare_eat()
var/obj/S = ..()
S.icon_state = dead_icon
return S
if(S)
S.icon_state = dead_icon
return S
/obj/item/organ/internal/heart/cursed
name = "cursed heart"
+3 -2
View File
@@ -304,8 +304,9 @@
/obj/item/organ/internal/lungs/prepare_eat()
var/obj/S = ..()
S.reagents.add_reagent("salbutamol", 5)
return S
if(S)
S.reagents.add_reagent("salbutamol", 5)
return S
/obj/item/organ/internal/lungs/plasmaman
name = "plasma filter"
@@ -38,5 +38,6 @@
data["isAI"] = isAI(user)
data["crewmembers"] = GLOB.crew_repository.health_data(T)
data["critThreshold"] = HEALTH_THRESHOLD_CRIT
return data
+1 -1
View File
@@ -113,6 +113,6 @@
return STATUS_CLOSE // Otherwise, we got nothing.
/mob/living/carbon/human/shared_living_ui_distance(atom/movable/src_object)
if(dna.GetSEState(GLOB.teleblock) && (get_dist(src, src_object) <= 2))
if(HAS_TRAIT(src, TRAIT_TELEKINESIS) && (get_dist(src, src_object) <= 2))
return STATUS_INTERACTIVE
return ..()
+3 -3
View File
@@ -49,9 +49,9 @@
var/turf/tile = loc
if(isturf(tile))
tile.clean_blood()
for(var/A in tile)
if(is_cleanable(A))
qdel(A)
for(var/obj/effect/E in tile)
if(E.is_cleanable())
qdel(E)
+3 -2
View File
@@ -19,8 +19,9 @@
if(!C)
return json_encode(list("error" = "No client with that name on server"))
var/message = "<font color='red'>Discord PM from <b><a href='?discord_msg=1'>[input["sender"]]</a></b>: [input["msg"]]</font>"
var/amessage = "<font color='blue'>Discord PM from <a href='?discord_msg=1'>[input["sender"]]</a> to <b>[key_name_admin(C)]</b>: [input["msg"]]</font>"
var/sanitized = sanitize(input["msg"])
var/message = "<font color='red'>Discord PM from <b><a href='?discord_msg=1'>[input["sender"]]</a></b>: [sanitized]</font>"
var/amessage = "<font color='blue'>Discord PM from <a href='?discord_msg=1'>[input["sender"]]</a> to <b>[key_name_admin(C)]</b>: [sanitized]</font>"
// THESE TWO VARS DO VERY DIFFERENT THINGS. DO NOT ATTEMPT TO COMBINE THEM
C.received_discord_pm = world.time