Merge branch 'master' into GunsAndGunAccessories

# Conflicts:
#	code/modules/projectiles/guns/projectile/automatic.dm
This commit is contained in:
Granodd
2019-01-26 02:17:22 -05:00
660 changed files with 18114 additions and 21521 deletions
+2 -1
View File
@@ -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/toggleadminhelpsound, /*toggles whether we hear bwoinks*/
/client/proc/toggleadminhelpsound,
/client/proc/togglementorhelpsound,
/client/proc/cmd_mentor_check_new_players,
/client/proc/cmd_mentor_check_player_exp /* shows players by playtime */
)
+3
View File
@@ -518,6 +518,9 @@
if(ticker.mode.vampire_enthralled.len)
dat += check_role_table("Vampire Thralls", ticker.mode.vampire_enthralled)
if(ticker.mode.devils.len)
dat += check_role_table("Devils", ticker.mode.devils)
if(ticker.mode.xenos.len)
dat += check_role_table("Xenos", ticker.mode.xenos)
+7 -6
View File
@@ -1812,16 +1812,17 @@
var/petchoice = input("Select pet type", "Pets") as null|anything in pets
if(isnull(petchoice))
return
var/mob/living/simple_animal/pet/P = new petchoice(H.loc)
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [P], pet of [H]?", poll_time = 200, min_hours = 10)
var/list/mob/dead/observer/candidates = pollCandidates("Play as the special event pet [H]?", poll_time = 200, min_hours = 10)
var/mob/dead/observer/theghost = null
if(candidates.len)
var/mob/living/simple_animal/pet/P = new petchoice(H.loc)
theghost = pick(candidates)
P.key = theghost.key
P.master_commander = H
P.universal_speak = 1
P.universal_understand = 1
P.can_collar = 1
P.faction = list("neutral")
var/obj/item/clothing/accessory/petcollar/C = new /obj/item/clothing/accessory/petcollar(P)
P.collar = C
C.equipped(P)
@@ -1833,15 +1834,15 @@
D.assignment = "Pet"
C.access_id = D
spawn(30)
var/newname = sanitize(copytext(input(P, "You are [P], pet of [H]. Would you like to change your name to something else?", "Name change", P.name) as null|text,1,MAX_NAME_LEN))
var/newname = sanitize(copytext(input(P, "You are [P], special event pet of [H]. Change your name to something else?", "Name change", P.name) as null|text,1,MAX_NAME_LEN))
if(newname && newname != P.name)
P.name = newname
if(P.mind)
P.mind.name = newname
logmsg = "pet ([P])."
else
to_chat(usr, "<span class='warning'>WARNING: Nobody volunteered to play [P].</span>")
qdel(P)
logmsg = "pet ([P])."
to_chat(usr, "<span class='warning'>WARNING: Nobody volunteered to play the special event pet.</span>")
logmsg = "pet (no volunteers)."
if("Human Protector")
usr.client.create_eventmob_for(H, 0)
logmsg = "syndie protector."
+1 -1
View File
@@ -108,7 +108,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if("Mentorhelp")
msg = "<span class='mentorhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, TRUE, selected_type)] ([ADMIN_QUE(mob,"?")]) ([ADMIN_PP(mob,"PP")]) ([ADMIN_VV(mob,"VV")]) ([ADMIN_SM(mob,"SM")]) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[UID()]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[mob.UID()]'>CL</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)
if(X.prefs.sound & SOUND_MENTORHELP)
X << 'sound/effects/adminhelp.ogg'
to_chat(X, msg)
if("Adminhelp")
+2 -2
View File
@@ -115,14 +115,14 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
if(!A || !IsValidSrc(A))
to_chat(usr, "<span class='warning'>Error: callproc_datum(): owner of proc no longer exists.</span>")
to_chat(src, "<span class='warning'>Error: callproc_datum(): owner of proc no longer exists.</span>")
return
message_admins("[key_name_admin(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
spawn()
var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
to_chat(usr, "<span class='notice'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</span>")
to_chat(src, "<span class='notice'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</span>")
feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -35,9 +35,6 @@ var/global/sent_syndicate_infiltration_team = 0
var/tctext = input(src, "How much TC do you want to give each team member? Suggested: 20-30. They cannot trade TC.") as num
var/tcamount = text2num(tctext)
tcamount = between(0, tcamount, 1000)
var/spawn_sit_mgmt = 0
if(alert("Spawn a syndicate mob for you, so you can brief them before they go?",,"Yes","No")=="Yes")
spawn_sit_mgmt = 1
if(sent_syndicate_infiltration_team == 1)
if(alert("A Syndicate Infiltration Team has already been sent. Sure you want to send another?",,"Yes","No")=="No")
return
@@ -85,7 +82,7 @@ var/global/sent_syndicate_infiltration_team = 0
var/mob/living/carbon/human/new_syndicate_infiltrator = create_syndicate_infiltrator(L, syndicate_leader_selected, tcamount, 0)
if(infiltrators.len)
var/mob/theguy = pick(infiltrators)
if(!spawn_sit_mgmt || theguy.key != key)
if(theguy.key != key)
new_syndicate_infiltrator.key = theguy.key
new_syndicate_infiltrator.internal = new_syndicate_infiltrator.s_store
new_syndicate_infiltrator.update_action_buttons_icon()
@@ -99,7 +96,7 @@ var/global/sent_syndicate_infiltration_team = 0
new_syndicate_infiltrator.loc = warpto.loc
sit_spawns_leader -= warpto
team_leader = new_syndicate_infiltrator
to_chat(new_syndicate_infiltrator, "<span class='danger'>As team leader, it is up to you to organize your team! Give the job to someone else if you can't handle it. Only your ID opens the exit door.</span>")
to_chat(new_syndicate_infiltrator, "<span class='danger'>As team leader, it is up to you to organize your team! Give the job to someone else if you can't handle it.</span>")
else
to_chat(new_syndicate_infiltrator, "<span class='danger'>Your team leader is: [team_leader]. They are in charge!</span>")
teamsize--
@@ -114,23 +111,6 @@ var/global/sent_syndicate_infiltration_team = 0
num_spawned++
if(!teamsize)
break
if(spawn_sit_mgmt)
for(var/obj/effect/landmark/L in sit_spawns_mgmt)
var/mob/living/carbon/human/syndimgmtmob = create_syndicate_infiltrator(L, 1, 100, 1)
syndimgmtmob.key = key
syndimgmtmob.internal = syndimgmtmob.s_store
syndimgmtmob.update_action_buttons_icon()
syndimgmtmob.faction += "syndicate"
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite, slot_wear_suit)
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite, slot_head)
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate, slot_wear_mask)
var/datum/atom_hud/antag/opshud = huds[ANTAG_HUD_OPS]
opshud.join_hud(syndimgmtmob.mind.current)
set_antag_hud(syndimgmtmob.mind.current, "hudoperative")
syndimgmtmob.mind.special_role = "Syndicate Management Consultant"
syndimgmtmob.regenerate_icons()
to_chat(syndimgmtmob, "<span class='userdanger'>You have spawned as Syndicate Management. You should brief them on their mission before they go.</span>")
message_admins("[key_name_admin(src)] has spawned a Syndicate Infiltration Team.", 1)
log_admin("[key_name(src)] used Spawn Syndicate Infiltration Team.")
feedback_add_details("admin_verb","SPAWNSIT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -172,7 +152,7 @@ var/global/sent_syndicate_infiltration_team = 0
// Implants:
// Uplink
var/obj/item/implant/uplink/U = new /obj/item/implant/uplink(src)
var/obj/item/implant/uplink/sit/U = new /obj/item/implant/uplink/sit(src)
U.implant(src)
if (flag_mgmt)
U.hidden_uplink.uses = 500
+3 -2
View File
@@ -3,7 +3,8 @@
set name = "Pray"
msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))
if(!msg) return
if(!msg)
return
if(usr.client)
if(usr.client.prefs.muted & MUTE_PRAY)
@@ -29,7 +30,7 @@
deity = ticker.cultdat.entity_name
log_say("(PRAYER) [msg]", usr)
msg = "<span class='notice'>[bicon(cross)]<b><font color=[font_color]>[prayer_type][deity ? " (to [deity])" : ""]:</font>[key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_SC(src,"SC")]) (<A HREF='?_src_=holder;Bless=[UID()]'>BLESS</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b> [msg]</span>"
msg = "<span class='notice'>[bicon(cross)]<b><font color=[font_color]>[prayer_type][deity ? " (to [deity])" : ""][mind && mind.isholy ? " (blessings: [mind.num_blessed])" : ""]:</font> [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_SC(src,"SC")]) (<A HREF='?_src_=holder;Bless=[UID()]'>BLESS</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b> [msg]</span>"
for(var/client/X in GLOB.admins)
if(check_rights(R_EVENT,0,X.mob))
+18 -14
View File
@@ -2,25 +2,29 @@
set category = "Event"
set name = "Unleash Floor Cluwne"
set desc = "Pick a specific target or just let it select randomly and spawn the floor cluwne mob on the station. Be warned: spawning more than one may cause issues!"
var/target
var/mob/living/carbon/human/target
if(!check_rights(R_EVENT))
return
var/confirm = alert("Are you sure you want to release a floor cluwne and kill alot of people?", "Confirm Massacre", "Yes", "No")
var/confirm = alert("Are you sure you want to release a floor cluwne and kill a lot of people?", "Confirm Massacre", "Yes", "No")
if(confirm == "Yes")
var/turf/T = get_turf(usr)
target = input("Any specific target in mind? Please note only live, non cluwned, human targets are valid.", "Target", target) as null|anything in GLOB.player_list
if(isnull(target))
var/list/potential_targets = list()
for(var/mob/M in GLOB.player_list)
var/mob/living/carbon/human/H = M
if(!istype(H))
continue
if(H.mind.assigned_role == "Cluwne")
continue
potential_targets += H
if(!potential_targets.len) //You're probably the only player on this damn station, spawn it yourself
to_chat(src, "<span class='notice'>No valid targets!</span>")
return
if(target && ishuman(target))
var/mob/living/carbon/human/H = target
var/mob/living/simple_animal/hostile/floor_cluwne/FC = new /mob/living/simple_animal/hostile/floor_cluwne(T)
FC.Acquire_Victim(H)
else
new /mob/living/simple_animal/hostile/floor_cluwne(T)
log_admin("[key_name(usr)] spawned floor cluwne.")
message_admins("[key_name(usr)] spawned floor cluwne.")
else
return
target = input("Any specific target in mind? Please note only live, non cluwned, human targets are valid.", "Target", target) as null|anything in potential_targets
var/mob/living/simple_animal/hostile/floor_cluwne/FC = new /mob/living/simple_animal/hostile/floor_cluwne(T)
if(target)
FC.Acquire_Victim(target)
log_admin("[key_name(usr)] spawned floor cluwne[target ? ", initially targetting [target]": null].")
message_admins("[key_name(usr)] spawned floor cluwne[target ? ", initially targetting [target]": null].")
@@ -85,14 +85,13 @@ var/global/sent_syndicate_strike_team = 0
to_chat(new_syndicate_commando, "<span class='notice'>You are an Elite Syndicate [is_leader ? "<B>TEAM LEADER</B>" : "commando"] in the service of the Syndicate. \nYour current mission is: <span class='userdanger'>[input]</span></span>")
new_syndicate_commando.faction += "syndicate"
var/datum/atom_hud/antag/opshud = huds[ANTAG_HUD_OPS]
opshud.join_hud(new_syndicate_commando.mind.current)
set_antag_hud(new_syndicate_commando.mind.current, "hudoperative")
new_syndicate_commando.regenerate_icons()
is_leader = FALSE
syndicate_commando_number--
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
if(L.name == "Syndicate-Commando-Bomb")
new /obj/effect/spawner/newbomb/timer/syndicate(L.loc)
qdel(L)
message_admins("<span class='notice'>[key_name_admin(usr)] has spawned a Syndicate strike squad.</span>", 1)
log_admin("[key_name(usr)] used Spawn Syndicate Squad.")
feedback_add_details("admin_verb","SDTHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -122,49 +121,46 @@ var/global/sent_syndicate_strike_team = 0
qdel(spawn_location)
return new_syndicate_commando
/mob/living/carbon/human/proc/equip_syndicate_commando(is_leader = FALSE)
/mob/living/carbon/human/proc/equip_syndicate_commando(is_leader = FALSE, full_gear = FALSE)
var/obj/item/radio/R = new /obj/item/radio/headset/syndicate/alt/syndteam(src)
R.set_frequency(SYNDTEAM_FREQ)
equip_to_slot_or_del(R, slot_l_ear)
equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_shoes)
if(is_leader)
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red/strike(src), slot_wear_suit)
else
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/strike(src), slot_wear_suit)
if(!full_gear)
equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(src), slot_shoes)
equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(src), slot_gloves)
if(is_leader)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/red/strike(src), slot_head)
else
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/strike(src), slot_head)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
equip_to_slot_or_del(new /obj/item/storage/backpack/security(src), slot_back)
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/mm556x45)
equip_to_slot_or_del(new /obj/item/storage/box/survival_syndi(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m45(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/gun/projectile/revolver(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/ammo_box/a357(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/flashlight(src), slot_in_backpack)
if(is_leader)
equip_to_slot_or_del(new /obj/item/pinpointer(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/disk/nuclear(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/card/emag(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/melee/energy/sword/saber(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/grenade/empgrenade(src), slot_r_store)
equip_to_slot_or_del(new /obj/item/tank/emergency_oxygen/double/full(src), slot_s_store)
equip_to_slot_or_del(new /obj/item/gun/projectile/automatic/pistol/m1911(src), slot_belt)
equip_to_slot_or_del(new /obj/item/card/emag(src), slot_r_store)
equip_to_slot_or_del(new /obj/item/melee/energy/sword/saber/red(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/gun/projectile/automatic/l6_saw(src), slot_r_hand)
if(full_gear)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/sst(src), slot_head)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
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/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)
var/obj/item/implant/dust/D = new /obj/item/implant/dust(src)
D.implant(src)
var/obj/item/card/id/syndicate/W = new(src) //Untrackable by AI
W.name = "[real_name]'s ID Card"
W.icon_state = "syndie"
W.access = get_all_accesses()//They get full station access because obviously the syndicate has HAAAX, and can make special IDs for their most elite members.
W.assignment = "Syndicate Commando"
W.access += get_syndicate_access(W.assignment)
W.registered_name = real_name
@@ -19,7 +19,7 @@
var/checking = FALSE
var/TC_cost = 0
var/borg_to_spawn
var/list/possible_types = list("Assault", "Medical")
var/list/possible_types = list("Assault", "Medical", "Saboteur")
/obj/item/antag_spawner/borg_tele/attack_self(mob/user)
if(used)
@@ -43,6 +43,7 @@
var/mob/M = pick(borg_candidates)
var/client/C = M.client
spawn_antag(C, get_turf(src.loc), "syndieborg")
qdel(src)
else
checking = FALSE
to_chat(user, "<span class='notice'>Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.</span>")
@@ -57,6 +58,8 @@
switch(borg_to_spawn)
if("Medical")
R = new /mob/living/silicon/robot/syndicate/medical(T)
if("Saboteur")
R = new /mob/living/silicon/robot/syndicate/saboteur(T)
else
R = new /mob/living/silicon/robot/syndicate(T) //Assault borg by default
R.key = C.key
@@ -70,9 +70,6 @@
H.dna.SetSEState(JUMPBLOCK, TRUE)
genemutcheck(H, JUMPBLOCK, null, MUTCHK_FORCED)
H.dna.SetSEState(SUPERFARTBLOCK, TRUE)
genemutcheck(H, SUPERFARTBLOCK, null, MUTCHK_FORCED)
H.dna.SetSEState(IMMOLATEBLOCK, TRUE)
genemutcheck(H, IMMOLATEBLOCK, null, MUTCHK_FORCED)
@@ -9,23 +9,20 @@
anchored = 1
var/obj/item/nanomob_card/card
var/datum/mob_hunt/mob_info
var/obj/effect/landmark/battle_mob_point/avatar_point
var/obj/effect/nanomob/battle/avatar
var/ready = 0
var/team = "Grey"
var/avatar_x_offset = 4
var/avatar_y_offset = 0
/obj/machinery/computer/mob_battle_terminal/red
pixel_y = 24
dir = SOUTH
team = "Red"
avatar_y_offset = -1
/obj/machinery/computer/mob_battle_terminal/blue
pixel_y = -24
dir = NORTH
team = "Blue"
avatar_y_offset = 1
/obj/machinery/computer/mob_battle_terminal/red/Initialize()
..()
@@ -94,7 +91,11 @@
/obj/machinery/computer/mob_battle_terminal/proc/update_avatar()
//if we don't have avatars yet, spawn them
if(!avatar)
avatar = new(locate((x + avatar_x_offset), (y + avatar_y_offset), z))
if(!avatar_point)
log_debug("[src] attempted to spawn a battle mob avatar without a spawn point!")
return
else
avatar = new(get_turf(avatar_point))
//update avatar info from card
if(mob_info)
avatar.mob_info = mob_info
@@ -211,6 +212,29 @@
if(SSmob_hunt && !SSmob_hunt.blue_terminal)
SSmob_hunt.blue_terminal = src
find_avatar_spawn_point()
/obj/machinery/computer/mob_battle_terminal/proc/find_avatar_spawn_point()
if(avatar_point)
return
var/obj/effect/landmark/battle_mob_point/closest
for(var/obj/effect/landmark/battle_mob_point/bmp in GLOB.landmarks_list)
if(!istype(bmp, /obj/effect/landmark/battle_mob_point))
continue
if(bmp.z != z) //only match with points on the same z-level)
continue
if(!closest || isnull(closest))
closest = bmp
continue
if(closest == bmp)
continue
if((abs(x-bmp.x)+abs(y-bmp.y)) < (abs(x-closest.x)+abs(y-closest.y))) //get_dist would be preferable if it didn't count diagonals as 1 distance, so we have to rely on actual x/y distances in this janky way.
closest = bmp
if(closest)
avatar_point = closest
else
log_debug("[src] was unable to locate a nearby mob battle landmark! Unable to spawn battle avatars!")
/obj/machinery/computer/mob_battle_terminal/proc/do_attack()
if(!ready) //no attacking if you arent ready to fight (duh)
return
+12
View File
@@ -222,6 +222,12 @@ var/global/datum/prizes/global_prizes = new
typepath = /obj/item/spellbook/oneuse/fake_gib
cost = 100
/datum/prize_item/fakefingergun
name = "Miming Manual : Finger Gun"
desc = "..."
typepath = /obj/item/spellbook/oneuse/mime/fingergun/fake
cost = 100
/datum/prize_item/magic_conch
name = "Magic Conch Shell"
desc = "All hail the magic conch!"
@@ -270,6 +276,12 @@ var/global/datum/prizes/global_prizes = new
typepath = /obj/item/toy/griffin
cost = 125
/datum/prize_item/codex_gigas
name = "Toy Codex Gigas"
desc = "For helping you come up with writing ideas for your diabolical adventures."
typepath = /obj/item/toy/codex_gigas/
cost = 75
/datum/prize_item/esword
name = "Toy Energy Sword"
desc = "A plastic replica of an energy blade."
+2 -2
View File
@@ -85,9 +85,9 @@
if(bombassembly)
bombassembly.on_found(finder)
/obj/item/onetankbomb/hear_talk(mob/living/M, msg)
/obj/item/onetankbomb/hear_talk(mob/living/M, list/message_pieces)
if(bombassembly)
bombassembly.hear_talk(M, msg)
bombassembly.hear_talk(M, message_pieces)
/obj/item/onetankbomb/hear_message(mob/living/M, msg)
if(bombassembly)
+3 -3
View File
@@ -98,11 +98,11 @@
a_right.on_found(finder)
/obj/item/assembly_holder/hear_talk(mob/living/M, msg)
/obj/item/assembly_holder/hear_talk(mob/living/M, list/message_pieces)
if(a_left)
a_left.hear_talk(M, msg)
a_left.hear_talk(M, message_pieces)
if(a_right)
a_right.hear_talk(M, msg)
a_right.hear_talk(M, message_pieces)
/obj/item/assembly_holder/hear_message(mob/living/M, msg)
if(a_left)
+4 -3
View File
@@ -148,6 +148,7 @@
for(var/mob/O in hearers(1, loc))
O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2)
return TRUE
/obj/item/assembly/signaler/proc/set_frequency(new_frequency)
if(!radio_controller)
@@ -167,9 +168,9 @@
receiving = TRUE
/obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
..()
for(var/obj/effect/anomaly/A in orange(0, src))
A.anomalyNeutralize()
if(..())
for(var/obj/effect/anomaly/A in orange(0, src))
A.anomalyNeutralize()
/obj/item/assembly/signaler/anomaly/attack_self()
return
+5 -5
View File
@@ -16,11 +16,11 @@
else
return "[src] is deactivated."
/obj/item/assembly/voice/hear_talk(mob/living/M as mob, msg)
hear_input(M, msg, 0)
/obj/item/assembly/voice/hear_talk(mob/living/M as mob, list/message_pieces)
hear_input(M, multilingual_to_message(message_pieces), 0)
/obj/item/assembly/voice/hear_message(mob/living/M as mob, msg)
hear_input(M, msg, 1)
hear_input(M, msg, 1)
/obj/item/assembly/voice/proc/hear_input(mob/living/M as mob, msg, type)
if(!istype(M,/mob/living))
@@ -56,7 +56,7 @@
/obj/item/assembly/voice/noise
name = "noise sensor"
desc = "A simple noise sensor that triggers on vocalizations other then speech."
desc = "A simple noise sensor that triggers on vocalizations other than speech."
icon_state = "voice"
materials = list(MAT_METAL=100, MAT_GLASS=10)
origin_tech = "magnets=1;engineering=1"
@@ -68,7 +68,7 @@
/obj/item/assembly/voice/noise/describe()
return "[src] does not appear to have any controls."
/obj/item/assembly/voice/noise/hear_talk(mob/living/M as mob, msg)
/obj/item/assembly/voice/noise/hear_talk(mob/living/M as mob, list/message_pieces)
return
/obj/item/assembly/voice/noise/hear_message(mob/living/M as mob, msg)
+4 -4
View File
@@ -351,7 +351,7 @@
/obj/effect/mob_spawn/human/clown/Initialize()
mob_name = pick(GLOB.clown_names)
..()
return ..()
/obj/effect/mob_spawn/human/corpse/clownmili
name = "Clown Soldier"
@@ -359,7 +359,7 @@
/obj/effect/mob_spawn/human/corpse/clownmili/Initialize()
mob_name = "Officer [pick(GLOB.clown_names)]"
..()
return ..()
/obj/effect/mob_spawn/human/corpse/clownoff
name = "Clown Officer"
@@ -367,7 +367,7 @@
/obj/effect/mob_spawn/human/corpse/clownoff/Initialize()
mob_name = "Honk Specialist [pick(GLOB.clown_names)]"
..()
return ..()
/datum/outfit/clownsoldier
@@ -398,7 +398,7 @@
/obj/effect/mob_spawn/human/mime/Initialize()
mob_name = pick(GLOB.mime_names)
..()
return ..()
/obj/effect/mob_spawn/human/scientist
name = "Scientist"
@@ -179,11 +179,6 @@
(the writing trails off, as if the writer was interrupted)<br>
"}
/obj/item/paper/terrorspiders9
name = "paper - 'Research Notes'"
info = "<b>The notes appear gibberish to you. Perhaps a destructive analyzer in R&D could make sense of them.</b>"
origin_tech = "combat=4;materials=4;engineering=4;biotech=4"
/obj/item/gun/energy/laser/awaymission_aeg
name = "Wireless Energy Gun"
desc = "An energy gun that recharges wirelessly during away missions. Does not work on the main station."
+3 -2
View File
@@ -17,8 +17,8 @@ You can set verify to TRUE if you want send() to sleep until the client has the
//When sending mutiple assets, how many before we give the client a quaint little sending resources message
#define ASSET_CACHE_TELL_CLIENT_AMOUNT 8
//When passively preloading assets, how many to send at once? Too high creates noticable lag where as too low can flood the client's cache with "verify" files
#define ASSET_CACHE_PRELOAD_CONCURRENT 3
//When passively preloading assets, how many to send at once? Too high creates noticable lag where as too low can flood the client's cache with "verify" files
#define ASSET_CACHE_PRELOAD_CONCURRENT 3
/client
var/list/cache = list() // List of all assets sent to this client by the asset cache.
@@ -191,6 +191,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the
"large_stamp-cent.png" = 'icons/paper_icons/large_stamp-cent.png',
"large_stamp-syndicate.png" = 'icons/paper_icons/large_stamp-syndicate.png',
"large_stamp-rep.png" = 'icons/paper_icons/large_stamp-rep.png',
"large_stamp-magistrate.png"= 'icons/paper_icons/large_stamp-magistrate.png',
"talisman.png" = 'icons/paper_icons/talisman.png',
"ntlogo.png" = 'icons/paper_icons/ntlogo.png'
)
+54 -31
View File
@@ -23,6 +23,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
ROLE_NINJA = 21,
ROLE_GSPIDER = 21,
ROLE_ABDUCTOR = 30,
ROLE_DEVIL = 14
)
/proc/player_old_enough_antag(client/C, role)
@@ -280,7 +281,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(species == "Vox")
dat += "<b>N2 Tank:</b> <a href='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]</a><br>"
if(species == "Grey")
dat += "<b>Voice:</b> <a href ='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Wingdings" : "Normal"]</a><BR>"
dat += "<b>Wingdings:</b> Set in disabilities<br>"
dat += "<b>Voice Translator:</b> <a href ='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Yes" : "No"]</a><br>"
dat += "<b>Secondary Language:</b> <a href='?_src_=prefs;preference=language;task=input'>[language]</a><br>"
if(S.autohiss_basic_map)
dat += "<b>Auto-accent:</b> <a href='?_src_=prefs;preference=autohiss_mode;task=input'>[autohiss_mode == AUTOHISS_FULL ? "Full" : (autohiss_mode == AUTOHISS_BASIC ? "Basic" : "Off")]</a><br>"
@@ -827,29 +829,32 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
return 1
/datum/preferences/proc/ShowDisabilityState(mob/user,flag,label)
/datum/preferences/proc/ShowDisabilityState(mob/user, flag, label)
var/datum/species/S = GLOB.all_species[species]
if(flag==DISABILITY_FLAG_FAT && !(CAN_BE_FAT in S.species_traits))
if(flag == DISABILITY_FLAG_FAT && !(CAN_BE_FAT in S.species_traits))
return "<li><i>[species] cannot be fat.</i></li>"
return "<li><b>[label]:</b> <a href=\"?_src_=prefs;task=input;preference=disabilities;disability=[flag]\">[disabilities & flag ? "Yes" : "No"]</a></li>"
/datum/preferences/proc/SetDisabilities(mob/user)
var/datum/species/S = GLOB.all_species[species]
var/HTML = "<body>"
HTML += "<tt><center>"
HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs glasses")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_COLOURBLIND,"Colourblind")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_TOURETTES,"Tourettes syndrome") // this will / can not be abused. It also SEVERELY stuns. It's just for fun.
HTML += ShowDisabilityState(user,DISABILITY_FLAG_NERVOUS,"Stutter")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_SWEDISH,"Swedish accent")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_LISP,"Lisp")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_DIZZY,"Dizziness")
HTML += ShowDisabilityState(user,DISABILITY_FLAG_SCRAMBLED,"Can't speak properly")
if(CAN_WINGDINGS in S.species_traits)
HTML += ShowDisabilityState(user, DISABILITY_FLAG_WINGDINGS, "Speak in Wingdings")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_NEARSIGHTED, "Needs glasses")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_FAT, "Obese")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_EPILEPTIC, "Seizures")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_DEAF, "Deaf")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_BLIND, "Blind")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_COLOURBLIND, "Colourblind")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_MUTE, "Mute")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_TOURETTES, "Tourettes syndrome") // this will / can not be abused. It also SEVERELY stuns. It's just for fun.
HTML += ShowDisabilityState(user, DISABILITY_FLAG_NERVOUS, "Stutter")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_SWEDISH, "Swedish accent")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_LISP, "Lisp")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_DIZZY, "Dizziness")
HTML += ShowDisabilityState(user, DISABILITY_FLAG_SCRAMBLED, "Can't speak properly")
HTML += {"</ul>
@@ -857,7 +862,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
<a href=\"?_src_=prefs;task=reset;preference=disabilities\">\[Reset\]</a>
</center></tt>"}
var/datum/browser/popup = new(user, "disabil", "<div align='center'>Choose Disabilities</div>", 350, 300)
var/datum/browser/popup = new(user, "disabil", "<div align='center'>Choose Disabilities</div>", 350, 380)
popup.set_content(HTML)
popup.open(0)
@@ -2191,47 +2196,65 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
character.change_eye_color(e_colour)
if(disabilities & DISABILITY_FLAG_FAT && (CAN_BE_FAT in character.dna.species.species_traits))
character.dna.SetSEState(FATBLOCK,1,1)
character.dna.SetSEState(FATBLOCK, TRUE, TRUE)
character.overeatduration = 600
character.dna.default_blocks.Add(FATBLOCK)
if(disabilities & DISABILITY_FLAG_NEARSIGHTED)
character.dna.SetSEState(GLASSESBLOCK,1,1)
character.dna.SetSEState(GLASSESBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(GLASSESBLOCK)
if(disabilities & DISABILITY_FLAG_EPILEPTIC)
character.dna.SetSEState(EPILEPSYBLOCK,1,1)
character.dna.SetSEState(EPILEPSYBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(EPILEPSYBLOCK)
if(disabilities & DISABILITY_FLAG_DEAF)
character.dna.SetSEState(DEAFBLOCK,1,1)
character.dna.SetSEState(DEAFBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(DEAFBLOCK)
if(disabilities & DISABILITY_FLAG_BLIND)
character.dna.SetSEState(BLINDBLOCK,1,1)
character.dna.SetSEState(BLINDBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(BLINDBLOCK)
if(disabilities & DISABILITY_FLAG_COLOURBLIND)
character.dna.SetSEState(COLOURBLINDBLOCK,1,1)
character.dna.SetSEState(COLOURBLINDBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(COLOURBLINDBLOCK)
if(disabilities & DISABILITY_FLAG_MUTE)
character.dna.SetSEState(MUTEBLOCK,1,1)
character.dna.SetSEState(MUTEBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(MUTEBLOCK)
if(disabilities & DISABILITY_FLAG_TOURETTES)
character.dna.SetSEState(TWITCHBLOCK,1,1)
character.dna.SetSEState(TWITCHBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(TWITCHBLOCK)
if(disabilities & DISABILITY_FLAG_NERVOUS)
character.dna.SetSEState(NERVOUSBLOCK,1,1)
character.dna.SetSEState(NERVOUSBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(NERVOUSBLOCK)
if(disabilities & DISABILITY_FLAG_SWEDISH)
character.dna.SetSEState(SWEDEBLOCK,1,1)
character.dna.SetSEState(SWEDEBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(SWEDEBLOCK)
if(disabilities & DISABILITY_FLAG_SCRAMBLED)
character.dna.SetSEState(SCRAMBLEBLOCK,1,1)
character.dna.SetSEState(SCRAMBLEBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(SCRAMBLEBLOCK)
if(disabilities & DISABILITY_FLAG_LISP)
character.dna.SetSEState(LISPBLOCK,1,1)
character.dna.SetSEState(LISPBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(LISPBLOCK)
if(disabilities & DISABILITY_FLAG_DIZZY)
character.dna.SetSEState(DIZZYBLOCK,1,1)
character.dna.SetSEState(DIZZYBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(DIZZYBLOCK)
if(disabilities & DISABILITY_FLAG_SCRAMBLED)
character.dna.SetSEState(SCRAMBLEBLOCK,1,1)
character.dna.SetSEState(SCRAMBLEBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(SCRAMBLEBLOCK)
if(disabilities & DISABILITY_FLAG_WINGDINGS && (CAN_WINGDINGS in character.dna.species.species_traits))
character.dna.SetSEState(WINGDINGSBLOCK, TRUE, TRUE)
character.dna.default_blocks.Add(WINGDINGSBLOCK)
character.dna.species.handle_dna(character)
@@ -46,6 +46,17 @@
to_chat(usr, "You will [(prefs.sound & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.")
feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/togglementorhelpsound()
set name = "Hear/Silence Mentorhelp Bwoinks"
set category = "Preferences"
set desc = "Toggle hearing a notification when mentorhelps are recieved"
if(!holder)
return
prefs.sound ^= SOUND_MENTORHELP
prefs.save_preferences(src)
to_chat(usr, "You will [(prefs.sound & SOUND_MENTORHELP) ? "now" : "no longer"] hear a sound when mentorhelps arrive.")
feedback_add_details("admin_verb","MHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/deadchat() // Deadchat toggle is usable by anyone.
set name = "Show/Hide Deadchat"
set category = "Preferences"
+1
View File
@@ -28,6 +28,7 @@
var/toggle_cooldown = null
var/cooldown = 0
var/species_disguise = null
var/magical = FALSE
//BS12: Species-restricted clothing check.
/obj/item/clothing/mob_can_equip(M as mob, slot)
+4
View File
@@ -83,6 +83,7 @@
origin_tech = "magnets=3;combat=2"
var/global/list/jobs[0]
HUDType = DATA_HUD_SECURITY_ADVANCED
var/read_only = FALSE
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
@@ -114,6 +115,9 @@
invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these
prescription_upgradable = 0
/obj/item/clothing/glasses/hud/security/sunglasses/read_only
read_only = TRUE
/obj/item/clothing/glasses/hud/security/sunglasses
name = "HUDSunglasses"
desc = "Sunglasses with a HUD."
+4 -1
View File
@@ -11,12 +11,15 @@
flags_inv = 0
actions_types = list(/datum/action/item_action/toggle_helmet_light)
burn_state = FIRE_PROOF
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/head/hardhat/attack_self(mob/user)
on = !on
icon_state = "hardhat[on]_[item_color]"
item_state = "hardhat[on]_[item_color]"
if(on)
set_light(brightness_on)
else
+41
View File
@@ -20,6 +20,12 @@
icon_state = "pwig"
item_state = "pwig"
/obj/item/clothing/head/justice_wig
name = "Justice wig"
desc = "A fancy powdered wig given to arbitrators of the law. It looks itchy."
icon_state = "jwig"
item_state = "jwig"
/obj/item/clothing/head/beret/blue
icon_state = "beret_blue"
@@ -70,6 +76,11 @@
desc = "A plastic replica of a syndicate agent's space helmet, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!"
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
/obj/item/clothing/head/cueball
name = "cueball helmet"
@@ -79,6 +90,10 @@
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/head/snowman
name = "snowman head"
@@ -88,6 +103,10 @@
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/head/that
name = "sturdy top-hat"
@@ -246,6 +265,10 @@
icon_state = "chickenhead"
item_state = "chickensuit"
flags = BLOCKHAIR
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/head/corgi
name = "corgi suit head"
@@ -396,6 +419,10 @@
item_state = "griffinhat"
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
actions_types = list(/datum/action/item_action/caw)
/obj/item/clothing/head/griffin/attack_self()
@@ -425,6 +452,10 @@
icon_state = "papersack"
flags = BLOCKHAIR
flags_inv = HIDEFACE|HIDEEARS
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/head/papersack/smiley
name = "paper sack hat"
@@ -432,6 +463,10 @@
icon_state = "papersack_smile"
flags = BLOCKHAIR
flags_inv = HIDEFACE|HIDEEARS
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/head/crown
name = "crown"
@@ -443,3 +478,9 @@
name = "magnificent crown"
desc = "A crown worn by only the highest emperors of the land."
icon_state = "fancycrown"
/obj/item/clothing/head/zepelli
name = "chequered diamond hat"
desc = "Wearing this makes you feel like a real mozzarella cheeseball. "
icon_state = "zepelli"
item_state = "zepelli"
@@ -6,6 +6,7 @@
* Pumpkin head
* Kitty ears
* Cardborg Disguise
* Head Mirror
*/
/*
@@ -131,6 +132,10 @@
flags_inv = HIDEEARS
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/head/ushanka/attack_self(mob/user as mob)
if(src.icon_state == "ushankadown")
@@ -154,6 +159,10 @@
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
brightness_on = 2 //luminosity when on
@@ -221,6 +230,11 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
species_disguise = "High-tech robot"
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/head/cardborg/equipped(mob/living/user, slot)
..()
@@ -233,3 +247,19 @@
/obj/item/clothing/head/cardborg/dropped(mob/living/user)
..()
user.remove_alt_appearance("standard_borg_disguise")
/*
* Head Mirror
*/
/obj/item/clothing/head/headmirror
name = "head mirror"
desc = "A band of rubber with a very reflective looking mirror attached to the front of it. One of the early signs of medical budget cuts."
icon_state = "head_mirror"
item_state = "head_mirror"
species_fit = list("Vox, Drask")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Drask" = 'icons/mob/species/drask/head.dmi',
"Grey" = 'icons/mob/species/grey/head.dmi'
)
+5 -3
View File
@@ -125,6 +125,8 @@
icon_state = "wizzclown"
item_state = "wizzclown"
flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR
flags_inv = HIDEEARS | HIDEEYES
magical = TRUE
/obj/item/clothing/mask/gas/virusclown_hat
name = "clown wig and mask"
@@ -203,7 +205,7 @@
var/safety = 1
actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust, /datum/action/item_action/selectphrase)
var/phrase_list = list(
"halt" = "HALT! HALT! HALT! HALT!",
"bobby" = "Stop in the name of the Law.",
"compliance" = "Compliance is in your best interest.",
@@ -272,11 +274,11 @@
else if(actiontype == /datum/action/item_action/selectphrase)
var/key = phrase_list[phrase]
var/message = phrase_list[key]
if (!safety)
to_chat(user, "<span class='notice'>You set the restrictor to: FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT.</span>")
return
switch(aggressiveness)
if(1)
phrase = (phrase < 6) ? (phrase + 1) : 1
+12 -17
View File
@@ -80,12 +80,6 @@
to_chat(usr, "You lack the ability to manipulate the lock.")
/obj/item/clothing/mask/muzzle/gag
name = "gag"
desc = "Stick this in their mouth to stop the noise."
icon_state = "gag"
w_class = WEIGHT_CLASS_TINY
/obj/item/clothing/mask/muzzle/tapegag
name = "tape gag"
desc = "MHPMHHH!"
@@ -104,14 +98,13 @@
"Grey" = 'icons/mob/species/grey/mask.dmi'
)
/obj/item/clothing/mask/muzzle/tapegag/dropped(mob/living/carbon/human/user)
var/atom/movable/R = new /obj/item/trash/tapetrash
var/turf/T = get_turf(src)
R.loc = T
transfer_fingerprints_to(R)
playsound(src,'sound/items/poster_ripped.ogg',40,1)
/obj/item/clothing/mask/muzzle/tapegag/dropped(mob/user)
var/obj/item/trash/tapetrash/TT = new(drop_location(src))
transfer_fingerprints_to(TT)
user.transfer_fingerprints_to(TT)
playsound(src, 'sound/items/poster_ripped.ogg', 40, 1)
..()
user.emote("scream")
. = ..()
/obj/item/clothing/mask/muzzle/safety
name = "safety muzzle"
@@ -182,9 +175,9 @@
trigger.HasProximity(AM)
/obj/item/clothing/mask/muzzle/safety/shock/hear_talk(mob/living/M as mob, msg)
/obj/item/clothing/mask/muzzle/safety/shock/hear_talk(mob/living/M as mob, list/message_pieces)
if(trigger)
trigger.hear_talk(M, msg)
trigger.hear_talk(M, message_pieces)
/obj/item/clothing/mask/muzzle/safety/shock/hear_message(mob/living/M as mob, msg)
if(trigger)
@@ -301,8 +294,10 @@
var/voicechange = 0
var/temporaryname = " the Horse"
var/originalname = ""
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/mask.dmi'
)
/obj/item/clothing/mask/horsehead/equipped(mob/user, slot)
if(flags & NODROP) //cursed masks only
+25 -3
View File
@@ -7,6 +7,7 @@
var/magpulse = 0
var/slowdown_active = 2
var/slowdown_passive = SHOES_SLOWDOWN
var/magpulse_name = "mag-pulse traction system"
actions_types = list(/datum/action/item_action/toggle)
strip_delay = 70
put_on_delay = 70
@@ -21,7 +22,7 @@
slowdown = slowdown_active
magpulse = !magpulse
icon_state = "[magboot_state][magpulse]"
to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system.")
to_chat(user, "You [magpulse ? "enable" : "disable"] the [magpulse_name].")
user.update_inv_shoes() //so our mob-overlays update
user.update_gravity(user.mob_has_gravity())
for(var/X in actions)
@@ -33,7 +34,7 @@
/obj/item/clothing/shoes/magboots/examine(mob/user)
..(user)
to_chat(user, "Its mag-pulse traction system appears to be [magpulse ? "enabled" : "disabled"].")
to_chat(user, "Its [magpulse_name] appears to be [magpulse ? "enabled" : "disabled"].")
/obj/item/clothing/shoes/magboots/advance
@@ -65,7 +66,28 @@ obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team
slowdown = SHOES_SLOWDOWN+1
slowdown_active = SHOES_SLOWDOWN+1
slowdown_passive = SHOES_SLOWDOWN+1
magpulse_name = "honk-powered traction system"
item_color = "clown"
silence_steps = 1
shoe_sound = "clownstep"
origin_tech = "magnets=4;syndicate=2"
origin_tech = "magnets=4;syndicate=2"
/obj/item/clothing/shoes/magboots/wizard //bundled with the wiz hardsuit
name = "boots of gripping"
desc = "These magical boots, once activated, will stay gripped to any surface without slowing you down."
icon_state = "wizmag0"
magboot_state = "wizmag"
slowdown_active = SHOES_SLOWDOWN //wiz hardsuit already slows you down, no need to double it
magpulse_name = "gripping ability"
magical = TRUE
/obj/item/clothing/shoes/magboots/wizard/attack_self(mob/user)
if(user)
if(user.mind in ticker.mode.wizards)
if(magpulse) //faint blue light when shoes are turned on gives a reason to turn them off when not needed in maint
set_light(0)
else
set_light(2, 1, LIGHT_COLOR_LIGHTBLUE)
..()
else
to_chat(user, "<span class='notice'>You poke the gem on [src]. Nothing happens.</span>")
+8 -4
View File
@@ -44,6 +44,7 @@
icon_state = "wizard"
strip_delay = 50
put_on_delay = 50
magical = TRUE
/obj/item/clothing/shoes/sandal/marisa
desc = "A pair of magic, black shoes."
@@ -79,9 +80,13 @@
slowdown = SHOES_SLOWDOWN+1
item_color = "clown"
var/footstep = 1 //used for squeeks whilst walking
silence_steps = 1
shoe_sound = "clownstep"
/obj/item/clothing/shoes/clown_shoes/magical
name = "magical clown shoes"
desc = "Standard-issue shoes of the wizarding class clown. Damn they're huge! And powerful! Somehow."
magical = TRUE
/obj/item/clothing/shoes/jackboots
name = "jackboots"
desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
@@ -93,7 +98,6 @@
put_on_delay = 50
burn_state = FIRE_PROOF
var/footstep = 1
silence_steps = 1
shoe_sound = "jackboot"
/obj/item/clothing/shoes/jackboots/jacksandals
@@ -182,10 +186,10 @@
item_state = "noble_boot"
/obj/item/clothing/shoes/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/stack/tape_roll))
if(istype(I, /obj/item/stack/tape_roll) && !silence_steps)
var/obj/item/stack/tape_roll/TR = I
if((!silence_steps || shoe_sound) && TR.use(4))
silence_steps = 1
silence_steps = TRUE
shoe_sound = null
to_chat(user, "You tape the soles of [src] to silence your footsteps.")
else
@@ -4,7 +4,7 @@
icon_state = "chronohelmet"
item_state = "chronohelmet"
slowdown = 1
armor = list(melee = 60, bullet = 30/*bullet through the visor*/, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90)
armor = list(melee = 60, bullet = 30, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90)
var/obj/item/clothing/suit/space/chronos/suit = null
/obj/item/clothing/head/helmet/space/chronos/dropped()
@@ -208,4 +208,4 @@
holder.remote_control = null
if(holder.client && (holder.client.eye == src))
holder.client.eye = holder
return ..()
return ..()
+28 -9
View File
@@ -206,6 +206,9 @@
else
to_chat(user, "You detach \the [helmet] from \the [src]'s helmet mount.")
helmet.loc = get_turf(src)
if(istype(helmet,/obj/item/clothing/head/helmet/space/hardsuit/syndi))
var/obj/item/clothing/head/helmet/space/hardsuit/syndi/S = helmet
S.linkedsuit = null
src.helmet = null
return
if(!boots)
@@ -226,11 +229,12 @@
to_chat(user, "You attach \the [W] to \the [src]'s helmet mount.")
user.drop_item()
W.loc = src
src.helmet = W
var/obj/item/clothing/head/helmet/space/hardsuit/syndi/S = W
S.forceMove(src)
helmet = S
S.link_suit()
helmet = W
if(istype(helmet,/obj/item/clothing/head/helmet/space/hardsuit/syndi))
var/obj/item/clothing/head/helmet/space/hardsuit/syndi/S = W
S.forceMove(src)
helmet = S
S.link_suit()
return
else if(istype(W,/obj/item/clothing/shoes/magboots) && can_modify(user))
@@ -335,6 +339,11 @@
linkedsuit = loc
/obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user)
if(!linkedsuit)
to_chat(user, "<span class='notice'>You must attach the helmet to a syndicate hardsuit to toggle combat mode!</span>")
return
on = !on
if(on)
to_chat(user, "<span class='notice'>You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed.</span>")
@@ -453,6 +462,16 @@
name = "elite syndicate hardsuit (combat)"
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
//Strike team hardsuits
/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/sst
armor = list(melee = 70, bullet = 70, laser = 50, energy = 40, bomb = 80, bio = 100, rad = 100) //Almost as good as DS gear, but unlike DS can switch to combat for mobility
icon_state = "hardsuit0-sst"
item_color = "sst"
/obj/item/clothing/suit/space/hardsuit/syndi/elite/sst
armor = list(melee = 70, bullet = 70, laser = 50, energy = 40, bomb = 80, bio = 100, rad = 100)
icon_state = "hardsuit0-sst"
item_color = "sst"
/obj/item/clothing/suit/space/hardsuit/syndi/freedom
name = "eagle suit"
@@ -470,15 +489,15 @@
icon_state = "hardsuit0-wiz"
item_state = "wiz_helm"
item_color = "wiz"
unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles!
unacidable = TRUE //No longer shall our kind be foiled by lone chemists with spray bottles!
armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
magical = TRUE
/obj/item/clothing/suit/space/hardsuit/wizard
icon_state = "hardsuit-wiz"
@@ -486,13 +505,13 @@
desc = "A bizarre gem-encrusted suit that radiates magical energies."
item_state = "wiz_hardsuit"
w_class = WEIGHT_CLASS_NORMAL
unacidable = 1
unacidable = TRUE
armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/teleportation_scroll,/obj/item/tank)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
unacidable = 1
sprite_sheets = null
magical = TRUE
//Medical hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/medical
@@ -99,8 +99,22 @@
name = "Santa's hat"
desc = "Ho ho ho. Merrry X-mas!"
icon_state = "santahat"
species_fit = list("Grey, Drask")
sprite_sheets = list(
"Grey" = 'icons/mob/species/Grey/head.dmi',
"Drask" = 'icons/mob/species/Drask/helmet.dmi'
)
flags = BLOCKHAIR | STOPSPRESSUREDMAGE
flags_cover = HEADCOVERSEYES
/obj/item/clothing/head/helmet/space/santahat/attack_self(mob/user as mob)
if(src.icon_state == "santahat")
src.icon_state = "santahat_beard"
src.item_state = "santahat_beard"
to_chat(user, "Santa's beard expands out from the hat!")
else
src.icon_state = "santahat"
src.item_state = "santahat"
to_chat(user, "The beard slinks back into the hat...")
/obj/item/clothing/suit/space/santa
name = "Santa's suit"
@@ -165,10 +179,9 @@
desc = "A brand new paramedic EVA suit. The nitrile seems a bit too thin to be space proof. Used for retrieving bodies in space."
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Vox", "Grey" , "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin")
species_fit = list("Vox", "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
"Grey" = 'icons/mob/species/grey/suit.dmi',
"Skrell" = 'icons/mob/species/skrell/suit.dmi',
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
"Drask" = 'icons/mob/species/drask/suit.dmi',
@@ -403,8 +403,10 @@
/obj/item/clothing/suit/space/eva/plasmaman/wizard
name = "robed plasmaman suit"
icon_state = "plasmamanWizardBlue_suit"
magical = TRUE
/obj/item/clothing/head/helmet/space/eva/plasmaman/wizard
name = "wizard hat"
icon_state = "plasmamanWizardBlue_helmet0"
base_state = "plasmamanWizardBlue_helmet"
magical = TRUE
+4 -3
View File
@@ -9,10 +9,11 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
burn_state = FIRE_PROOF
species_fit = list("Vox")
species_fit = list("Vox", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi'
)
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/suit/bio_suit
name = "bio suit"
+2 -2
View File
@@ -16,7 +16,7 @@
item_state = "bluetag"
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
allowed = list (/obj/item/gun/energy/laser/bluetag)
allowed = list (/obj/item/gun/energy/laser/tag/blue)
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
@@ -30,7 +30,7 @@
item_state = "redtag"
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
allowed = list (/obj/item/gun/energy/laser/redtag)
allowed = list (/obj/item/gun/energy/laser/tag/red)
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
+2 -2
View File
@@ -28,8 +28,8 @@
pockets.emp_act(severity)
..()
/obj/item/clothing/suit/storage/hear_talk(mob/M, var/msg)
pockets.hear_talk(M, msg)
/obj/item/clothing/suit/storage/hear_talk(mob/M, list/message_pieces)
pockets.hear_talk(M, message_pieces)
..()
/obj/item/clothing/suit/storage/hear_message(mob/M, var/msg)
+4 -2
View File
@@ -77,7 +77,8 @@
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi'
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/suit/bomb_suit
@@ -130,7 +131,8 @@
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi'
"Vox" = 'icons/mob/species/vox/head.dmi',
"Grey" = 'icons/mob/species/grey/head.dmi'
)
/obj/item/clothing/suit/radiation
+7 -1
View File
@@ -10,6 +10,7 @@
//Not given any special protective value since the magic robes are full-body protection --NEO
strip_delay = 50
put_on_delay = 50
magical = TRUE
/obj/item/clothing/head/wizard/red
name = "red wizard hat"
@@ -35,6 +36,7 @@
gas_transfer_coefficient = 1
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
magical = FALSE
/obj/item/clothing/head/wizard/marisa
name = "Witch Hat"
@@ -67,6 +69,7 @@
strip_delay = 50
put_on_delay = 50
burn_state = FIRE_PROOF
magical = TRUE
/obj/item/clothing/suit/wizrobe/red
name = "red wizard robe"
@@ -120,6 +123,7 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
unacidable = 0
burn_state = FLAMMABLE
magical = FALSE
/obj/item/clothing/head/wizard/marisa/fake
name = "Witch Hat"
@@ -130,6 +134,7 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
unacidable = 0
burn_state = FLAMMABLE
magical = FALSE
/obj/item/clothing/suit/wizrobe/marisa/fake
name = "Witch Robe"
@@ -140,4 +145,5 @@
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
unacidable = 0
burn_state = FLAMMABLE
burn_state = FLAMMABLE
magical = FALSE
@@ -40,8 +40,8 @@
hold.emp_act(severity)
..()
/obj/item/clothing/accessory/storage/hear_talk(mob/M, var/msg, verb, datum/language/speaking)
hold.hear_talk(M, msg, verb, speaking)
/obj/item/clothing/accessory/storage/hear_talk(mob/M, list/message_pieces, verb)
hold.hear_talk(M, message_pieces, verb)
..()
/obj/item/clothing/accessory/storage/hear_message(mob/M, var/msg, verb, datum/language/speaking)
+20 -1
View File
@@ -145,6 +145,19 @@
..()
desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears [station_name()] on the left shoulder."
/obj/item/clothing/under/rank/centcom/magistrate
desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Magistrate\" and bears \"N.S.S. Cyberiad\" on the left shoulder."
name = "\improper Nanotrasen Navy Uniform"
icon_state = "officer"
item_state = "g_suit"
item_color = "officer"
displays_id = 0
flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/centcom/magistrate/New()
..()
desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Magistrate\" and bears [station_name()] on the left shoulder."
/obj/item/clothing/under/rank/centcom/diplomatic
desc = "A very gaudy and official looking uniform of the Nanotrasen Diplomatic Corps."
name = "\improper Nanotrasen Diplomatic Uniform"
@@ -798,7 +811,6 @@
flags = NODROP
has_sensor = 0 // HUNKE
/obj/item/clothing/under/victdress
name = "black victorian dress"
desc = "A victorian style dress, fancy!"
@@ -840,3 +852,10 @@
item_state = "medicalgown"
item_color = "medicalgown"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/under/burial
name = "burial garments"
desc = "Traditional burial garments from the early 22nd century."
icon_state = "burial"
item_state = "burial"
item_color = "burial"
+1 -8
View File
@@ -79,11 +79,4 @@
name = "camo pants"
desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station."
icon_state = "camopants"
item_color = "camopants"
/obj/item/clothing/under/pants/chaps
name = "black leather assless chaps"
desc = "For those brave enough to weather the breeze."
icon_state = "chaps"
item_color = "chaps"
flags_size = ONESIZEFITSALL
item_color = "camopants"
+45 -2
View File
@@ -6,7 +6,8 @@
var/time = 30 //time in deciseconds
var/parts[] = list() //type paths of items that will be placed in the result
var/chem_catalysts[] = list() //like tools but for reagents
var/category = CAT_MISC // Recipe category
var/category = CAT_NONE // Recipe category
var/roundstart_enabled = TRUE //Set to FALSE if you don't want a particular crafting recipe to be available all the time
/datum/crafting_recipe/proc/AdjustChems(var/obj/resultobj as obj)
//This proc is to replace the make_food proc of recipes from microwaves and such that are being converted to table crafting recipes.
@@ -89,6 +90,17 @@
time = 40
category = CAT_ROBOT
/datum/crafting_recipe/honkbot
name = "Honkbot"
result = /mob/living/simple_animal/bot/honkbot
reqs = list(/obj/item/robot_parts/r_arm = 1,
/obj/item/bikehorn = 1,
/obj/item/assembly/prox_sensor = 1,
/obj/item/storage/box/clown = 1,
/obj/item/instrument/trombone = 1)
time = 40
category = CAT_ROBOT
/datum/crafting_recipe/floorbot
name = "Floorbot"
result = /mob/living/simple_animal/bot/floorbot
@@ -239,6 +251,7 @@
reqs = list(/obj/item/camera = 1,
/datum/reagent/holywater = 10)
parts = list(/obj/item/camera = 1)
category = CAT_MISC
/datum/crafting_recipe/papersack
name = "Paper Sack"
@@ -247,12 +260,21 @@
reqs = list(/obj/item/paper = 5)
category = CAT_MISC
/datum/crafting_recipe/sushimat
name = "Sushi Mat"
result = /obj/item/kitchen/sushimat
time = 10
reqs = list(/obj/item/stack/sheet/wood = 1,
/obj/item/stack/cable_coil = 2)
category = CAT_MISC
/datum/crafting_recipe/notreallysoap
name = "Homemade Soap"
result = /obj/item/soap/ducttape
time = 50
reqs = list(/obj/item/stack/tape_roll = 1,
/datum/reagent/liquidgibs = 10)
category = CAT_MISC
/datum/crafting_recipe/garrote
name = "Makeshift Garrote"
@@ -289,6 +311,7 @@
time = 15
reqs = list(/obj/item/clothing/gloves/color/latex = 1,
/obj/item/stack/cable_coil = 5)
category = CAT_MISC
/datum/crafting_recipe/gold_horn
name = "Golden bike horn"
@@ -388,4 +411,24 @@
/obj/item/stack/rods = 2,
/obj/item/assembly/prox_sensor = 1) // Not a timer because the system sees a diamond drill as a drill too, letting you make both otherwise.
tools = list(/obj/item/screwdriver, /obj/item/wrench)
category = CAT_MISC
category = CAT_MISC
/datum/crafting_recipe/faketoolbox
name = "Black and Red toolbox"
result = /obj/item/storage/toolbox/fakesyndi
time = 40
reqs = list(/datum/reagent/paint/red = 10,
/datum/reagent/paint/black = 30,
/obj/item/storage/toolbox = 1) //Paint in reagents so it doesnt take the container up, yet still take it from the beaker
tools = list(/obj/item/reagent_containers/glass/rag = 1) //need something to paint with it
category = CAT_MISC
/datum/crafting_recipe/snowman
name = "Snowman"
result = /obj/structure/snowman/built
reqs = list(/obj/item/snowball = 10,
/obj/item/reagent_containers/food/snacks/grown/carrot = 1,
/obj/item/grown/log = 2)
time = 50
category = CAT_MISC
roundstart_enabled = FALSE
+86 -4
View File
@@ -514,8 +514,6 @@
return
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
#undef USED_MOD_HELM
#undef USED_MOD_SUIT
/obj/item/fluff/merchant_sallet_modkit //Travelling Merchant: Trav Noble. This is what they spawn in with
name = "SG Helmet modkit"
@@ -584,8 +582,6 @@
else
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
#define USED_MOD_HELM 1
#define USED_MOD_SUIT 2
/obj/item/fluff/pyro_wintersec_kit //DarkLordpyro: Valthorne Haliber
name = "winter sec conversion kit"
@@ -639,6 +635,70 @@
return
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
/obj/item/fluff/sylus_conversion_kit //Decemviri: Sylus Cain
name = "cerberus pattern conversion kit"
desc = "A securirty hardsuit conversion kit."
icon_state = "modkit"
w_class = WEIGHT_CLASS_SMALL
/obj/item/fluff/sylus_conversion_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
var/mob/living/carbon/human/H = user
if(istype(target, /obj/item/clothing/head/helmet/space/hardsuit/security))
if(used & USED_MOD_HELM)
to_chat(H, "<span class='notice'>The kit's helmet modifier has already been used.</span>")
return
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
used |= USED_MOD_HELM
var/obj/item/clothing/head/helmet/space/hardsuit/security/P = target
P.name = "cerberus pattern security hardsuit helmet"
P.desc = "A special helmet that protects against hazardous, low pressure environments. Has an additional layer of armor and rigging for combat duty."
P.icon = 'icons/obj/custom_items.dmi'
P.icon_state = "hardsuit0-secc"
P.item_state = "hardsuit0-secc"
P.sprite_sheets = null
P.item_color = "secc"
user.update_icons()
if(P == H.head)
H.update_inv_head()
if(used & USED_MOD_HELM && used & USED_MOD_SUIT)
qdel(src)
return
if(istype(target, /obj/item/clothing/suit/space/hardsuit/security))
if(used & USED_MOD_SUIT)
to_chat(user, "<span class='notice'>The kit's suit modifier has already been used.</span>")
return
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
used |= USED_MOD_SUIT
var/obj/item/clothing/suit/space/hardsuit/security/P = target
P.name = "cerberus pattern security hardsuit"
P.desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor and rigging for combat duty"
P.icon = 'icons/obj/custom_items.dmi'
P.icon_state = "hardsuit-secc"
P.item_state = "hardsuit-secc"
P.sprite_sheets = null
user.update_icons()
if(P == H.wear_suit)
H.update_inv_wear_suit()
if(used & USED_MOD_HELM && used & USED_MOD_SUIT)
qdel(src)
return
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
#undef USED_MOD_HELM
#undef USED_MOD_SUIT
//////////////////////////////////
//////////// Clothing ////////////
//////////////////////////////////
@@ -840,6 +900,13 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
icon_state = "dusty_jacket"
/obj/item/clothing/suit/fluff/cheeky_sov_coat //CheekyCrenando: Srusu Rskuzu
name = "Srusu's Greatcoat"
desc = "A heavy wool Soviet-style greatcoat. A name is written in fancy handwriting on the inside tag: Srusu Rskuzu"
icon = 'icons/obj/custom_items.dmi'
item_state = "cheeky_sov_coat"
icon_state = "cheeky_sov_coat"
/obj/item/clothing/suit/fluff/supplymaster_jacket //Denthamos: Henry Grandpa Gadow
name = "faded NT Supply Master's Coat"
desc = "A faded leather overcoat bearing a worn out badge from the NAS Crescent on the shoulder, and a designation tag of Supply Master on the front. A tarnished gold nameplate says H.Gadow on it."
@@ -1537,3 +1604,18 @@
item_color = "Xann_necklace"
slot_flags = SLOT_TIE
/obj/item/instrument/accordion/fluff/asmer_accordion //Asmerath: Coloratura
name = "Rara's Somber Accordion"
desc = "A blue colored accordion with claw indentations on the keys made special for vulpkanins."
icon = 'icons/obj/custom_items.dmi'
icon_state = "asmer_accordion"
item_state = "asmer_accordion"
/obj/item/clothing/head/rabbitears/fluff/pinesalad_bunny // Pineapple Salad : Dan Jello
name = "Bluespace rabbit ears"
desc = "A pair of sparkly bluespace rabbit ears, with a small tag on them that reads, 'Dan Jello~'. Yuck, \
there's some pink slime on the part that goes on your head!"
icon = 'icons/obj/custom_items.dmi'
icon_state = "ps_bunny"
@@ -21,6 +21,7 @@
can_be_placed_into = null
flags = NOBLUDGEON
container_type = OPENCONTAINER
has_lid = FALSE
var/wipespeed = 30
/obj/item/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag)
+2 -1
View File
@@ -170,6 +170,7 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Brand Intelligence", /datum/event/brand_intelligence, 50, list(ASSIGNMENT_ENGINEER = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 50, list(ASSIGNMENT_ENGINEER = 50)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Dimensional Tear", /datum/event/tear, 0, list(ASSIGNMENT_SECURITY = 35)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Honknomoly", /datum/event/tear/honk, 0),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Vent Clog", /datum/event/vent_clog, 250),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Wormholes", /datum/event/wormholes, 150),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Pyro Anomaly", /datum/event/anomaly/anomaly_pyro, 75, list(ASSIGNMENT_ENGINEER = 60)),
@@ -193,7 +194,7 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 5), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Abductor Visit", /datum/event/abductor, 80, is_one_shot = 1),
new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 0, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 180, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Terror Spiders", /datum/event/spider_terror, 0, list(ASSIGNMENT_SECURITY = 15), is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Slaughter Demon", /datum/event/spawn_slaughter, 15, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Floor Cluwne", /datum/event/spawn_floor_cluwne, 15, is_one_shot = 1)
+1 -1
View File
@@ -1,4 +1,4 @@
/datum/event/carp_migration
/datum/event/carp_migration/koi
spawned_mobs = list(
/mob/living/simple_animal/hostile/retaliate/carp/koi = 95,
/mob/living/simple_animal/hostile/retaliate/carp/koi/honk = 2,
+3 -2
View File
@@ -28,6 +28,7 @@
density = 0
anchored = 1
luminosity = 3
var/list/tear_critters = list()
/obj/effect/tear/New()
..()
@@ -38,10 +39,10 @@
animation.master = src
// flick("newtear",usr)
spawn(15)
if(animation) qdel(animation)
if(animation)
qdel(animation)
spawn(rand(30,120))
var/list/tear_critters = list()
for(var/T in typesof(/mob/living/simple_animal))
var/mob/living/simple_animal/SA = T
if(initial(SA.gold_core_spawnable) == CHEM_MOB_SPAWN_HOSTILE)
+41
View File
@@ -0,0 +1,41 @@
/datum/event/tear/honk
var/obj/effect/tear/honk/HE //i could just inherit but its being finicky.
/datum/event/tear/honk/announce()
event_announcement.Announce("A Honknomoly has opened. Expected location: [impact_area.name].", "Honknomoly Alert", 'sound/items/airhorn.ogg')
/datum/event/tear/honk/start()
var/turf/T = pick(get_area_turfs(impact_area))
if(T)
HE = new /obj/effect/tear/honk(T.loc)
/datum/event/tear/honk/end()
if(HE)
qdel(HE)
/obj/effect/tear/honk
name="Honkmensional Tear"
desc="A tear in the dimensional fabric of sanity."
icon='icons/effects/tear.dmi'
icon_state="tear"
tear_critters = list(/mob/living/simple_animal/hostile/retaliate/clown/goblin)
/obj/effect/tear/honk/New()
var/atom/movable/overlay/animation = null
animation = new(loc)
animation.icon_state = "newtear"
animation.icon = 'icons/effects/tear.dmi'
animation.master = src
spawn(15)
if(animation)
qdel(animation)
spawn(rand(30,120))
for(var/i in 1 to 6)
var/chosen = pick(tear_critters)
var/mob/living/simple_animal/C = new chosen
C.forceMove(get_turf(src))
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(C, pick(NORTH,SOUTH,EAST,WEST))
+21 -33
View File
@@ -6,7 +6,7 @@ var/global/list/unused_trade_stations = list("sol")
/datum/event/traders
var/success_spawn = 0
var/station = null
var/spawn_count = 3
var/spawn_count = 2
var/list/trader_objectives = list()
/datum/event/traders/setup()
@@ -16,6 +16,10 @@ var/global/list/unused_trade_stations = list("sol")
/datum/event/traders/start()
if(!station) // If there are no unused stations, just no.
return
if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED)
event_announcement.Announce("A trading shuttle from Jupiter Station has been denied docking permission due to the heightened security alert aboard [station_name()].", "Trader Shuttle Docking Request Refused")
return
var/list/spawnlocs = list()
for(var/obj/effect/landmark/landmark in GLOB.landmarks_list)
if(landmark.name == "traderstart_[station]")
@@ -35,53 +39,37 @@ var/global/list/unused_trade_stations = list("sol")
var/turf/picked_loc = spawnlocs[index]
index++
var/mob/C = pick_n_take(candidates)
spawn_count--
if(C)
GLOB.respawnable_list -= C.client
var/mob/living/carbon/human/M = create_trader(picked_loc)
M.ckey = C.ckey
var/mob/living/carbon/human/M = new /mob/living/carbon/human(picked_loc)
M.ckey = C.ckey // must be before equipOutfit, or that will runtime due to lack of mind
M.equipOutfit(/datum/outfit/admin/sol_trader)
M.dna.species.after_equip_job(null, M)
M.mind.objectives += trader_objectives
greet_trader(M)
success_spawn = 1
if(!success_spawn)
if(success_spawn)
event_announcement.Announce("A trading shuttle from Jupiter Station has been granted docking permission at [station_name()] arrivals port 4.", "Trader Shuttle Docking Request Accepted")
else
unused_trade_stations += station // Return the station to the list of usable stations.
/datum/event/traders/proc/create_trader(var/turf/picked_loc)
var/mob/living/carbon/human/M
switch(station)
if("sol")
M = new /mob/living/carbon/human(picked_loc)
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/storage/backpack/industrial(M), slot_back)
var/obj/item/card/id/supply/W = new(M)
W.name = "[M.real_name]'s ID Card (Sol Trader)"
W.assignment = "Sol Trader"
W.registered_name = M.real_name
W.access = list(access_trade_sol, access_maint_tunnels, access_external_airlocks)
M.equip_to_slot_or_del(W, slot_wear_id)
return M
/datum/event/traders/proc/greet_trader(var/mob/living/carbon/human/M)
to_chat(M, "<span class='boldnotice'>You are a trader!</span>")
to_chat(M, "<span class='notice'>You are currently docked at [get_area(M)].</span>")
to_chat(M, "<span class='notice'>You are about to trade with [station_name()].</span>")
to_chat(M, "<span class='notice'>Negotiate an agreement, and request docking.</span>")
spawn(25)
show_objectives(M.mind)
/datum/event/traders/proc/forge_trader_objectives()
var/i = 1
var/max_objectives = pick(2, 2, 2, 2, 3, 3, 3, 4)
var/list/objs = list()
var/list/goals = list("stockparts")
while(i<= max_objectives)
var/goal = pick(goals)
var/datum/objective/trade/O
if(goal == "stockparts")
O = new /datum/objective/trade/stock(station)
O.choose_target()
objs += O
i++
var/datum/objective/trade/plasma/P = new /datum/objective/trade/plasma
P.choose_target()
objs += P
var/datum/objective/trade/credits/C = new /datum/objective/trade/credits
C.choose_target()
objs += C
return objs
+5 -5
View File
@@ -728,7 +728,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
people += H
if(person) //Basic talk
var/image/speech_overlay = image('icons/mob/talk.dmi', person, "h0", layer = ABOVE_MOB_LAYER)
target.hear_say(pick(speak_messages),language = pick(person.languages),speaker = person)
target.hear_say(message_to_multilingual(pick(speak_messages), pick(person.languages)), speaker = person)
if(target.client)
target.client.images |= speech_overlay
sleep(30)
@@ -738,7 +738,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
humans += H
person = pick(humans)
target.hear_radio(pick(radio_messages),language = pick(person.languages),speaker = person, part_a = "<span class='[frequency_span_class(PUB_FREQ)]'><b>\[[get_frequency_name(PUB_FREQ)]\]</b> <span class='name'>", part_b = "</span> <span class='message'>")
target.hear_radio(message_to_multilingual(pick(radio_messages), pick(person.languages)), speaker = person, part_a = "<span class='[frequency_span_class(PUB_FREQ)]'><b>\[[get_frequency_name(PUB_FREQ)]\]</b> <span class='name'>", part_b = "</span> <span class='message'>")
qdel(src)
/obj/effect/hallucination/message
@@ -754,7 +754,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
"<span class='warning'>You feel a tiny prick!</span>",
"<B>[target]</B> sneezes.",
"<span class='warning'>You feel faint.</span>",
"<span class='noticealien'>You hear a strange, alien voice in your head...</span>[pick("Hiss","Ssss")]",
"<span class='noticealien'>You hear a strange, alien voice in your head...</span> [pick("Hiss","Ssss")]",
"<span class='notice'>You can see...everything!</span>")
to_chat(target, chosen)
qdel(src)
@@ -817,9 +817,9 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0)
if(9)
//To make it more realistic, I added two gunshots (enough to kill)
playsound_local(null, 'sound/weapons/gunshots/Gunshot.ogg', 25, 1)
playsound_local(null, 'sound/weapons/gunshots/gunshot.ogg', 25, 1)
var/timer_pause = rand(10,30)
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound_local, null, 'sound/weapons/gunshots/Gunshot.ogg', 25, 1), timer_pause)
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound_local, null, 'sound/weapons/gunshots/gunshot.ogg', 25, 1), timer_pause)
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound_local, null, sound(get_sfx("bodyfall"), 25), 25, 1), timer_pause+rand(5,10))
if(10)
playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50)
@@ -114,6 +114,8 @@
reagents.chem_temp += 15
to_chat(user, "<span class='notice'>You heat [src] with [I].</span>")
reagents.handle_reactions()
else
return ..()
/obj/item/reagent_containers/food/drinks/examine(mob/user)
if(!..(user, 1))
@@ -63,6 +63,6 @@
/obj/item/reagent_containers/food/drinks/drinkingglass/devilskiss
list_reagents = list("devilskiss" = 50)
/obj/item/reagent_containers/food/drinks/drinkingglass/alliescocktail
list_reagents = list("alliescocktail" = 50)
list_reagents = list("alliescocktail" = 25, "omnizine" = 25)
@@ -26,9 +26,6 @@
"sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"))
var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters.
/obj/item/reagent_containers/food/condiment/attackby(obj/item/W, mob/user, params)
return
/obj/item/reagent_containers/food/condiment/attack_self(mob/user)
return
@@ -55,9 +52,6 @@
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
return 1
/obj/item/reagent_containers/food/condiment/attackby(obj/item/I, mob/user, params)
return
/obj/item/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity)
if(!proximity)
return
@@ -88,6 +88,23 @@
trash = /obj/item/trash/plate
filling_color = "#FADA8E"
/obj/item/reagent_containers/food/snacks/sliceable/bananacake
name = "banana cake"
desc = "A cake with added bananas."
icon_state = "bananacake"
slice_path = /obj/item/reagent_containers/food/snacks/bananacakeslice
slices_num = 5
bitesize = 3
filling_color = "#FADA8E"
list_reagents = list("nutriment" = 20, "vitamin" = 5)
/obj/item/reagent_containers/food/snacks/bananacakeslice
name = "banana cake slice"
desc = "Just a slice of cake, it is enough for everyone."
icon_state = "bananacake_slice"
trash = /obj/item/trash/plate
filling_color = "#FADA8E"
/obj/item/reagent_containers/food/snacks/sliceable/limecake
name = "lime cake"
desc = "A cake with added lime."
@@ -328,7 +345,7 @@
/obj/item/reagent_containers/food/snacks/donut/sprinkles
name = "frosted donut"
icon_state = "donut2"
list_reagents = list("nutriment" = 3, "sugar" = 2, "spinkles" = 2)
list_reagents = list("nutriment" = 3, "sugar" = 2, "sprinkles" = 2)
filling_color = "#FF69B4"
randomized_sprinkles = 0
@@ -97,6 +97,16 @@
bitesize = 3
list_reagents = list("nutriment" = 2)
/obj/item/reagent_containers/food/snacks/sliceable/Ebi_maki
name = "Ebi Makiroll"
desc = "A large unsliced roll of Ebi Sushi."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "Ebi_maki"
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Ebi
slices_num = 4
bitesize = 3
list_reagents = list("nutriment" = 8)
/obj/item/reagent_containers/food/snacks/sushi_Ebi
name = "Ebi Sushi"
desc = "A simple sushi consisting of cooked shrimp and rice."
@@ -105,6 +115,16 @@
bitesize = 3
list_reagents = list("nutriment" = 2)
/obj/item/reagent_containers/food/snacks/sliceable/Ikura_maki
name = "Ikura Makiroll"
desc = "A large unsliced roll of Ikura Sushi."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "Ikura_maki"
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Ikura
slices_num = 4
bitesize = 3
list_reagents = list("nutriment" = 8, "protein" = 4)
/obj/item/reagent_containers/food/snacks/sushi_Ikura
name = "Ikura Sushi"
desc = "A simple sushi consisting of salmon roe."
@@ -113,6 +133,16 @@
bitesize = 3
list_reagents = list("nutriment" = 2, "protein" = 1)
/obj/item/reagent_containers/food/snacks/sliceable/Sake_maki
name = "Sake Makiroll"
desc = "A large unsliced roll of Ebi Sushi."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "Sake_maki"
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Sake
slices_num = 4
bitesize = 3
list_reagents = list("nutriment" = 8)
/obj/item/reagent_containers/food/snacks/sushi_Sake
name = "Sake Sushi"
desc = "A simple sushi consisting of raw salmon and rice."
@@ -121,6 +151,16 @@
bitesize = 3
list_reagents = list("nutriment" = 2)
/obj/item/reagent_containers/food/snacks/sliceable/SmokedSalmon_maki
name = "Smoked Salmon Makiroll"
desc = "A large unsliced roll of Smoked Salmon Sushi."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "SmokedSalmon_maki"
slice_path = /obj/item/reagent_containers/food/snacks/sushi_SmokedSalmon
slices_num = 4
bitesize = 3
list_reagents = list("nutriment" = 8)
/obj/item/reagent_containers/food/snacks/sushi_SmokedSalmon
name = "Smoked Salmon Sushi"
desc = "A simple sushi consisting of cooked salmon and rice."
@@ -129,6 +169,16 @@
bitesize = 3
list_reagents = list("nutriment" = 2)
/obj/item/reagent_containers/food/snacks/sliceable/Tamago_maki
name = "Tamago Makiroll"
desc = "A large unsliced roll of Tamago Sushi."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "Tamago_maki"
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Tamago
slices_num = 4
bitesize = 3
list_reagents = list("nutriment" = 8)
/obj/item/reagent_containers/food/snacks/sushi_Tamago
name = "Tamago Sushi"
desc = "A simple sushi consisting of egg and rice."
@@ -137,6 +187,16 @@
bitesize = 3
list_reagents = list("nutriment" = 2)
/obj/item/reagent_containers/food/snacks/sliceable/Inari_maki
name = "Inari Makiroll"
desc = "A large unsliced roll of Inari Sushi."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "Inari_maki"
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Inari
slices_num = 4
bitesize = 3
list_reagents = list("nutriment" = 8)
/obj/item/reagent_containers/food/snacks/sushi_Inari
name = "Inari Sushi"
desc = "A piece of fried tofu stuffed with rice."
@@ -145,6 +205,16 @@
bitesize = 3
list_reagents = list("nutriment" = 2)
/obj/item/reagent_containers/food/snacks/sliceable/Masago_maki
name = "Masago Makiroll"
desc = "A large unsliced roll of Masago Sushi."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "Masago_maki"
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Masago
slices_num = 4
bitesize = 3
list_reagents = list("nutriment" = 8, "protein" = 4)
/obj/item/reagent_containers/food/snacks/sushi_Masago
name = "Masago Sushi"
desc = "A simple sushi consisting of goldfish roe."
@@ -153,6 +223,16 @@
bitesize = 3
list_reagents = list("nutriment" = 2, "protein" = 1)
/obj/item/reagent_containers/food/snacks/sliceable/Tobiko_maki
name = "Tobiko Makiroll"
desc = "A large unsliced roll of Tobkio Sushi."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "Tobiko_maki"
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Tobiko
slices_num = 4
bitesize = 3
list_reagents = list("nutriment" = 8, "protein" = 4)
/obj/item/reagent_containers/food/snacks/sushi_Tobiko
name = "Tobiko Sushi"
desc = "A simple sushi consisting of shark roe."
@@ -161,6 +241,16 @@
bitesize = 3
list_reagents = list("nutriment" = 2, "protein" = 1)
/obj/item/reagent_containers/food/snacks/sliceable/TobikoEgg_maki
name = "Tobiko and Egg Makiroll"
desc = "A large unsliced roll of Tobkio and Egg Sushi."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "TobikoEgg_maki"
slice_path = /obj/item/reagent_containers/food/snacks/sushi_TobikoEgg
slices_num = 4
bitesize = 3
list_reagents = list("nutriment" = 8, "protein" = 4)
/obj/item/reagent_containers/food/snacks/sushi_TobikoEgg
name = "Tobiko and Egg Sushi"
desc = "A sushi consisting of shark roe and an egg."
@@ -169,6 +259,16 @@
bitesize = 3
list_reagents = list("nutriment" = 2, "protein" = 1)
/obj/item/reagent_containers/food/snacks/sliceable/Tai_maki
name = "Tai Makiroll"
desc = "A large unsliced roll of Tai Sushi."
icon = 'icons/obj/food/seafood.dmi'
icon_state = "Tai_maki"
slice_path = /obj/item/reagent_containers/food/snacks/sushi_Tai
slices_num = 4
bitesize = 3
list_reagents = list("nutriment" = 8)
/obj/item/reagent_containers/food/snacks/sushi_Tai
name = "Tai Sushi"
desc = "A simple sushi consisting of catfish and rice."
+3 -1
View File
@@ -79,7 +79,7 @@
if(istype(W,/obj/item/storage))
..() // -> item/attackby(, params)
if(istype(W,/obj/item/kitchen/utensil))
else if(istype(W,/obj/item/kitchen/utensil))
var/obj/item/kitchen/utensil/U = W
@@ -116,6 +116,8 @@
TrashItem.forceMove(loc)
qdel(src)
return TRUE
else
return ..()
/obj/item/reagent_containers/food/snacks/proc/generate_trash(atom/location)
if(trash)
@@ -75,8 +75,7 @@
to_chat(user, "<span class='warning'>Wait for [occupant.name] to finish being loaded!</span>")
return
else
startgibbing(user)
startgibbing(user)
/obj/machinery/gibber/attackby(obj/item/P, mob/user, params)
if(istype(P, /obj/item/grab))
@@ -113,7 +112,7 @@
move_into_gibber(user,target)
/obj/machinery/gibber/proc/move_into_gibber(var/mob/user,var/mob/living/victim)
/obj/machinery/gibber/proc/move_into_gibber(mob/user, mob/living/victim)
if(occupant)
to_chat(user, "<span class='danger'>The [src] is full, empty it first!</span>")
return
@@ -215,7 +214,7 @@
qdel(holder2) //get rid of holder object
locked = 0 //unlock
/obj/machinery/gibber/proc/startgibbing(var/mob/user, var/UserOverride=0)
/obj/machinery/gibber/proc/startgibbing(mob/user, UserOverride=0)
if(!istype(user) && !UserOverride)
log_debug("Some shit just went down with the gibber at X[x], Y[y], Z[z] with an invalid user. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
return
@@ -249,11 +248,11 @@
for(var/i=1 to slab_count)
var/obj/item/reagent_containers/food/snacks/meat/new_meat = new slab_type(src)
new_meat.name = "[slab_name] [new_meat.name]"
new_meat.reagents.add_reagent("nutriment",slab_nutrition)
new_meat.reagents.add_reagent("nutriment", slab_nutrition)
if(occupant.reagents)
occupant.reagents.trans_to(new_meat, round(occupant.reagents.total_volume/slab_count,1))
occupant.reagents.trans_to(new_meat, round(occupant.reagents.total_volume/slab_count, 1))
if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
@@ -279,11 +278,10 @@
occupant.death(1)
occupant.ghostize()
qdel(occupant)
QDEL_NULL(occupant)
spawn(gibtime)
playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1)
operating = 0
if(stealthmode)
for(var/atom/movable/AM in contents)
@@ -292,12 +290,12 @@
else
for(var/obj/item/thing in contents) //Meat is spawned inside the gibber and thrown out afterwards.
thing.loc = get_turf(thing) // Drop it onto the turf for throwing.
thing.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) // Being pelted with bits of meat and bone would hurt.
thing.throw_at(get_edge_target_turf(src, gib_throw_dir), rand(1, 5), 15) // Being pelted with bits of meat and bone would hurt.
sleep(1)
for(var/obj/effect/gibs in contents) //throw out the gibs too
gibs.loc = get_turf(gibs) //drop onto turf for throwing
gibs.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15)
gibs.throw_at(get_edge_target_turf(src, gib_throw_dir), rand(1, 5), 15)
sleep(1)
pixel_x = initial(pixel_x) //return to it's spot after shaking
@@ -358,7 +356,7 @@
break
victim_targets.Cut()
/obj/machinery/gibber/autogibber/proc/force_move_into_gibber(var/mob/living/carbon/human/victim)
/obj/machinery/gibber/autogibber/proc/force_move_into_gibber(mob/living/carbon/human/victim)
if(!istype(victim)) return 0
visible_message("<span class='danger'>\The [victim.name] gets sucked into \the [src]!</span>")
@@ -385,7 +383,7 @@
qdel(O) //they are already dead by now
H.unEquip(O)
O.loc = loc
O.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15)
O.throw_at(get_edge_target_turf(src, gib_throw_dir), rand(1, 5), 15)
sleep(1)
for(var/obj/item/clothing/C in H)
@@ -393,7 +391,7 @@
qdel(C)
H.unEquip(C)
C.loc = loc
C.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15)
C.throw_at(get_edge_target_turf(src, gib_throw_dir), rand(1, 5), 15)
sleep(1)
visible_message("<span class='warning'>\The [src] spits out \the [H.name]'s possessions!")
@@ -405,7 +403,7 @@
qdel(O)
else if(istype(O))
O.loc = loc
O.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15)
O.throw_at(get_edge_target_turf(src, gib_throw_dir), rand(1, 5), 15)
spats++
sleep(1)
if(spats)
@@ -355,6 +355,17 @@
)
result = /obj/item/reagent_containers/food/snacks/sliceable/orangecake
/datum/recipe/oven/bananacake
reagents = list("milk" = 5)
items = list(
/obj/item/reagent_containers/food/snacks/dough,
/obj/item/reagent_containers/food/snacks/dough,
/obj/item/reagent_containers/food/snacks/dough,
/obj/item/reagent_containers/food/snacks/grown/banana,
/obj/item/reagent_containers/food/snacks/grown/banana
)
result = /obj/item/reagent_containers/food/snacks/sliceable/bananacake
/datum/recipe/oven/limecake
reagents = list("milk" = 5)
items = list(
@@ -82,6 +82,16 @@
result = /obj/item/reagent_containers/food/snacks/sushi_Ebi
category = CAT_FOOD
/datum/crafting_recipe/Ebi_maki
name = "Ebi Makiroll"
reqs = list(
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/reagent_containers/food/snacks/boiled_shrimp = 4,
)
tools = list(/obj/item/kitchen/sushimat)
result = /obj/item/reagent_containers/food/snacks/sliceable/Ebi_maki
category = CAT_FOOD
/datum/crafting_recipe/sushi_Ikura
name = "Ikura Sushi"
reqs = list(
@@ -91,6 +101,16 @@
result = /obj/item/reagent_containers/food/snacks/sushi_Ikura
category = CAT_FOOD
/datum/crafting_recipe/Ikura_maki
name = "Ikura Makiroll"
reqs = list(
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/fish_eggs/salmon = 4,
)
tools = list(/obj/item/kitchen/sushimat)
result = /obj/item/reagent_containers/food/snacks/sliceable/Ikura_maki
category = CAT_FOOD
/datum/crafting_recipe/sushi_Inari
name = "Inari Sushi"
reqs = list(
@@ -100,6 +120,16 @@
result = /obj/item/reagent_containers/food/snacks/sushi_Inari
category = CAT_FOOD
/datum/crafting_recipe/Inari_maki
name = "Inari Makiroll"
reqs = list(
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/reagent_containers/food/snacks/fried_tofu = 4,
)
tools = list(/obj/item/kitchen/sushimat)
result = /obj/item/reagent_containers/food/snacks/sliceable/Inari_maki
category = CAT_FOOD
/datum/crafting_recipe/sushi_Sake
name = "Sake Sushi"
reqs = list(
@@ -109,6 +139,16 @@
result = /obj/item/reagent_containers/food/snacks/sushi_Sake
category = CAT_FOOD
/datum/crafting_recipe/Sake_maki
name = "Sake Makiroll"
reqs = list(
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/reagent_containers/food/snacks/salmonmeat = 4,
)
tools = list(/obj/item/kitchen/sushimat)
result = /obj/item/reagent_containers/food/snacks/sliceable/Sake_maki
category = CAT_FOOD
/datum/crafting_recipe/sushi_SmokedSalmon
name = "Smoked Salmon Sushi"
reqs = list(
@@ -118,6 +158,16 @@
result = /obj/item/reagent_containers/food/snacks/sushi_SmokedSalmon
category = CAT_FOOD
/datum/crafting_recipe/SmokedSalmon_maki
name = "Smoked Salmon Makiroll"
reqs = list(
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/reagent_containers/food/snacks/salmonsteak = 4,
)
tools = list(/obj/item/kitchen/sushimat)
result = /obj/item/reagent_containers/food/snacks/sliceable/SmokedSalmon_maki
category = CAT_FOOD
/datum/crafting_recipe/sushi_Masago
name = "Masago Sushi"
reqs = list(
@@ -127,6 +177,16 @@
result = /obj/item/reagent_containers/food/snacks/sushi_Masago
category = CAT_FOOD
/datum/crafting_recipe/Masago_maki
name = "Masago Makiroll"
reqs = list(
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/fish_eggs/goldfish = 4,
)
tools = list(/obj/item/kitchen/sushimat)
result = /obj/item/reagent_containers/food/snacks/sliceable/Masago_maki
category = CAT_FOOD
/datum/crafting_recipe/sushi_Tobiko
name = "Tobiko Sushi"
reqs = list(
@@ -136,6 +196,16 @@
result = /obj/item/reagent_containers/food/snacks/sushi_Tobiko
category = CAT_FOOD
/datum/crafting_recipe/Tobiko_maki
name = "Tobiko Makiroll"
reqs = list(
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/fish_eggs/shark = 4,
)
tools = list(/obj/item/kitchen/sushimat)
result = /obj/item/reagent_containers/food/snacks/sliceable/Tobiko_maki
category = CAT_FOOD
/datum/crafting_recipe/sushi_TobikoEgg
name = "Tobiko and Egg Sushi"
reqs = list(
@@ -145,6 +215,26 @@
result = /obj/item/reagent_containers/food/snacks/sushi_TobikoEgg
category = CAT_FOOD
/datum/crafting_recipe/TobikoEgg_maki
name = "Tobiko Makiroll"
reqs = list(
/obj/item/reagent_containers/food/snacks/sushi_Tobiko = 4,
/obj/item/reagent_containers/food/snacks/egg = 4,
)
tools = list(/obj/item/kitchen/sushimat)
result = /obj/item/reagent_containers/food/snacks/sliceable/TobikoEgg_maki
category = CAT_FOOD
/datum/crafting_recipe/Sake_maki
name = "Sake Makiroll"
reqs = list(
/obj/item/reagent_containers/food/snacks/sushi_Tobiko = 4,
/obj/item/reagent_containers/food/snacks/egg = 4,
)
tools = list(/obj/item/kitchen/sushimat)
result = /obj/item/reagent_containers/food/snacks/sliceable/TobikoEgg_maki
category = CAT_FOOD
/datum/crafting_recipe/sushi_Tai
name = "Tai Sushi"
reqs = list(
@@ -153,3 +243,32 @@
)
result = /obj/item/reagent_containers/food/snacks/sushi_Tai
category = CAT_FOOD
/datum/crafting_recipe/Tai_maki
name = "Tai Makiroll"
reqs = list(
/obj/item/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/reagent_containers/food/snacks/catfishmeat = 4,
)
tools = list(/obj/item/kitchen/sushimat)
result = /obj/item/reagent_containers/food/snacks/sliceable/Tai_maki
category = CAT_FOOD
/datum/crafting_recipe/food
/datum/crafting_recipe/food/New()
parts |= reqs
/datum/crafting_recipe/food/cak
name = "Living cat/cake hybrid"
reqs = list(
/obj/item/organ/internal/brain = 1,
/obj/item/organ/internal/heart = 1,
/obj/item/reagent_containers/food/snacks/sliceable/birthdaycake = 1,
/obj/item/reagent_containers/food/snacks/meat/slab = 3,
/datum/reagent/blood = 30,
/datum/reagent/consumable/sprinkles = 5,
/datum/reagent/teslium = 1,
)
result = /mob/living/simple_animal/pet/cat/cak
category = CAT_FOOD
+2
View File
@@ -219,6 +219,8 @@
var/mob/M = usr
if(M.incapacitated() || !Adjacent(M))
return
if(!ishuman(M))
return
if(over_object == M || istype(over_object, /obj/screen))
if(!remove_item_from_storage(M))
+5
View File
@@ -6,6 +6,11 @@
new /obj/item/a_gift(T)
for(var/mob/living/simple_animal/pet/corgi/Ian/Ian in GLOB.mob_list)
Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian))
GLOB.crafting_recipes += new /datum/crafting_recipe/snowman
//The following spawn is necessary as both the timer and the shuttle systems initialise after the events system does, so we can't add stuff to the shuttle system as it doesn't exist yet and we can't use a timer
spawn(60 SECONDS)
var/datum/supply_packs/xmas = SSshuttle.supply_packs["[/datum/supply_packs/misc/snow_machine]"]
xmas.special_enabled = TRUE
/datum/holiday/xmas/handle_event()
spawnTree()
+11 -1
View File
@@ -21,6 +21,15 @@
add_random_traits()
add_random_plant_type(35)
/obj/item/seeds/random/labelled
name = "pack of exotic strange seeds"
/obj/item/seeds/random/labelled/New()
. = ..()
add_random_traits(1, 2)
add_random_plant_type(100)
desc = "Label: \n" + get_analyzer_text()
/obj/item/reagent_containers/food/snacks/grown/random
seed = /obj/item/seeds/random
name = "strange plant"
@@ -32,4 +41,5 @@
. = ..()
wine_power = rand(0.1,1.5)
if(prob(1))
wine_power = 2.0
wine_power = 2.0
+16 -9
View File
@@ -30,15 +30,19 @@
if(!contains_sample)
for(var/datum/reagent/blood/bloodSample in W.reagents.reagent_list)
if(bloodSample.data["mind"] && bloodSample.data["cloneable"] == 1)
mind = bloodSample.data["mind"]
ckey = bloodSample.data["ckey"]
realName = bloodSample.data["real_name"]
blood_gender = bloodSample.data["gender"]
blood_type = bloodSample.data["blood_type"]
factions = bloodSample.data["factions"]
W.reagents.clear_reagents()
to_chat(user, "<span class='notice'>You inject the contents of the syringe into the seeds.</span>")
contains_sample = 1
var/datum/mind/tempmind = bloodSample.data["mind"]
if(tempmind.is_revivable())
mind = bloodSample.data["mind"]
ckey = bloodSample.data["ckey"]
realName = bloodSample.data["real_name"]
blood_gender = bloodSample.data["gender"]
blood_type = bloodSample.data["blood_type"]
factions = bloodSample.data["factions"]
W.reagents.clear_reagents()
to_chat(user, "<span class='notice'>You inject the contents of the syringe into the seeds.</span>")
contains_sample = 1
else
to_chat(user, "<span class='warning'>The seeds reject the sample!</span>")
else
to_chat(user, "<span class='warning'>The seeds reject the sample!</span>")
else
@@ -80,6 +84,9 @@
ckey_holder = M.ckey
break
if(mind && !mind.is_revivable())
make_podman = 0
if(make_podman) //all conditions met!
var/mob/living/carbon/human/diona/podman = new /mob/living/carbon/human/diona(parent.loc)
if(realName)
+53
View File
@@ -0,0 +1,53 @@
/obj/item/book/codex_gigas
name = "Codex Gigas"
icon_state ="demonomicon"
throw_speed = 1
throw_range = 10
burn_state = LAVA_PROOF
author = "Forces beyond your comprehension"
unique = TRUE
title = "The codex gigas"
var/inUse = 0
/obj/item/book/codex_gigas/attack_self(mob/user)
if(!user.has_vision())
return
if(inUse)
to_chat(user,"<span class='notice'>Someone else is reading it.</span>")
return
if(!user.is_literate())
to_chat(user,"<span class='notice'>You don't know how to read.</span>")
return
if(ishuman(user))
var/mob/living/carbon/human/U = user
if(U.check_acedia())
to_chat(user,"<span class='notice'>None of this matters, why are you reading this? You put the [title] down.</span>")
return
inUse = 1
var/devilName = copytext(sanitize(input(user, "What infernal being do you wish to research?", "Codex Gigas", null) as text),1,MAX_MESSAGE_LEN)
var/speed = 300
var/correctness = 85
var/willpower = 95
if(U.job in list("Librarian")) // the librarian is both faster, and more accurate than normal crew members at research
speed = 45
correctness = 100
willpower = 100
if(U.job in list("Captain", "Security Officer", "Head of Security", "Detective", "Warden"))
willpower = 99
if(U.job in list("Clown")) // WHO GAVE THE CLOWN A DEMONOMICON? BAD THINGS WILL HAPPEN!
willpower = 25
correctness -= U.getBrainLoss() *0.5 //Brain damage makes researching hard.
speed += U.getBrainLoss() * 3
user.visible_message("[user] opens [title] and begins reading intently.")
if(do_after(U, speed, 0, U))
var/usedName = devilName
if(!prob(correctness))
usedName += "x"
var/datum/devilinfo/devil = devilInfo(usedName, 0)
user << browse("Information on [devilName]<br><br><br>[lawlorify[LORE][devil.ban]]<br>[lawlorify[LORE][devil.bane]]<br>[lawlorify[LORE][devil.obligation]]<br>[lawlorify[LORE][devil.banish]]", "window=book")
inUse = 0
sleep(10)
if(!prob(willpower))
U.influenceSin()
onclose(user, "book")
+1 -1
View File
@@ -18,7 +18,7 @@
pixel_x = rand(0,16)-8
pixel_y = rand(0,8)-8
icon_state = "coin_[cmineral]_heads"
icon_state = "coin_[cmineral]_[sideslist[1]]"
if(cmineral)
name = "[cmineral] coin"
+4 -1
View File
@@ -335,6 +335,8 @@
var/datum/design/alloy = files.FindDesignByID(alloy_id)
if((check_access(inserted_id) || allowed(usr)) && alloy)
var/desired = input("How many sheets?", "How many sheets would you like to smelt?", 1) as null|num
if(desired < 1) // Stops an exploit that lets you build negative alloys and get free materials
return
var/smelt_amount = can_smelt_alloy(alloy)
var/amount = round(min(desired,50,smelt_amount))
materials.use_amount(alloy.materials, amount)
@@ -843,9 +845,10 @@
to_chat(user, "<span class='info'>[src] is only effective on lesser beings.</span>")
return
/obj/item/lazarus_injector/emag_act()
/obj/item/lazarus_injector/emag_act(mob/user)
if(!malfunctioning)
malfunctioning = 1
to_chat(user, "<span class='notice'>You override [src]'s safety protocols.</span>")
/obj/item/lazarus_injector/emp_act()
if(!malfunctioning)
@@ -112,9 +112,9 @@
activation_method = pick("touch","laser","bullet","energy","bomb","mob_bump","weapon","speech") // "heat" removed due to lack of is_hot()
..()
/obj/machinery/anomalous_crystal/hear_talk(mob/speaker, message)
/obj/machinery/anomalous_crystal/hear_talk(mob/speaker, list/message_pieces)
..()
if(isliving(speaker) && message)
if(isliving(speaker) && LAZYLEN(message_pieces))
ActivationReaction(speaker, "speech")
/obj/machinery/anomalous_crystal/attack_hand(mob/user)
+1 -1
View File
@@ -34,7 +34,7 @@
ranged_message = "shoots"
ranged_cooldown_time = 30
projectiletype = /obj/item/projectile/kinetic
projectilesound = 'sound/weapons/gunshots/Gunshot4.ogg'
projectilesound = 'sound/weapons/gunshots/gunshot4.ogg'
speak_emote = list("states")
wanted_objects = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver,
/obj/item/stack/ore/plasma, /obj/item/stack/ore/uranium, /obj/item/stack/ore/iron,
+2 -1
View File
@@ -3,7 +3,8 @@
/mob/camera
name = "camera mob"
density = 0
anchored = 1
move_force = INFINITY
move_resist = INFINITY
status_flags = GODMODE // You can't damage it.
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
see_in_dark = 7
+3
View File
@@ -3,3 +3,6 @@
/mob/dead/gib() //ghosts can't be gibbed.
return
/mob/dead
move_resist = INFINITY
+26 -11
View File
@@ -13,7 +13,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
density = 0
canmove = 0
alpha = 127
anchored = 1 // don't get pushed around
move_resist = INFINITY // don't get pushed around
invisibility = INVISIBILITY_OBSERVER
var/can_reenter_corpse
var/bootime = 0
@@ -25,7 +25,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
var/image/ghostimage = null //this mobs ghost image, for deleting and stuff
var/ghostvision = 1 //is the ghost able to see things humans can't?
var/seedarkness = 1
var/data_hud_seen = 0 //this should one of the defines in __DEFINES/hud.dm
var/data_hud_seen = FALSE //this should one of the defines in __DEFINES/hud.dm
/mob/dead/observer/New(var/mob/body=null, var/flags=1)
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
@@ -297,30 +297,43 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/proc/show_me_the_hud(hud_index)
var/datum/atom_hud/H = huds[hud_index]
H.add_hud_to(src)
data_hud_seen = hud_index
/mob/dead/observer/proc/remove_the_hud(hud_index) //remove old huds
var/datum/atom_hud/H = huds[hud_index]
H.remove_hud_from(src)
/mob/dead/observer/verb/toggle_medHUD()
set category = "Ghost"
set name = "Toggle Medic/Sec/DiagHUD"
set desc = "Toggles the medical HUD."
set name = "Toggle Medic/Sec/Diag/All HUDs"
set desc = "Toggles the HUDs."
if(!client)
return
if(data_hud_seen) //remove old huds
var/datum/atom_hud/H = huds[data_hud_seen]
H.remove_hud_from(src)
switch(data_hud_seen) //give new huds
if(0)
if(FALSE)
data_hud_seen = DATA_HUD_SECURITY_ADVANCED
show_me_the_hud(DATA_HUD_SECURITY_ADVANCED)
to_chat(src, "<span class='notice'>Security HUD set.</span>")
if(DATA_HUD_SECURITY_ADVANCED)
data_hud_seen = DATA_HUD_MEDICAL_ADVANCED
remove_the_hud(DATA_HUD_SECURITY_ADVANCED)
show_me_the_hud(DATA_HUD_MEDICAL_ADVANCED)
to_chat(src, "<span class='notice'>Medical HUD set.</span>")
if(DATA_HUD_MEDICAL_ADVANCED)
data_hud_seen = DATA_HUD_DIAGNOSTIC
remove_the_hud(DATA_HUD_MEDICAL_ADVANCED)
show_me_the_hud(DATA_HUD_DIAGNOSTIC)
to_chat(src, "<span class='notice'>Diagnostic HUD set.</span>")
if(DATA_HUD_DIAGNOSTIC)
data_hud_seen = 0
data_hud_seen = data_hud_seen + DATA_HUD_SECURITY_ADVANCED + DATA_HUD_MEDICAL_ADVANCED
show_me_the_hud(DATA_HUD_SECURITY_ADVANCED)
show_me_the_hud(DATA_HUD_MEDICAL_ADVANCED)
to_chat(src, "<span class='notice'>All HUDs enabled.</span>")
else
data_hud_seen = FALSE
remove_the_hud(DATA_HUD_DIAGNOSTIC)
remove_the_hud(DATA_HUD_SECURITY_ADVANCED)
remove_the_hud(DATA_HUD_MEDICAL_ADVANCED)
to_chat(src, "<span class='notice'>HUDs disabled.</span>")
@@ -702,10 +715,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
else
new_char.key = key
/mob/dead/observer/is_literate()
return TRUE
/mob/dead/observer/proc/open_spawners_menu()
set name = "Mob spawners menu"
set desc = "See all currently available ghost spawners"
set category = "Ghost"
var/datum/spawners_menu/menu = new /datum/spawners_menu(src)
menu.ui_interact(src)
+1 -1
View File
@@ -38,7 +38,7 @@
. = 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)
/mob/dead/observer/handle_track(var/message, var/verb = "says", 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)
+11
View File
@@ -10,3 +10,14 @@
/mob/proc/death(gibbed)
return FALSE
/mob/proc/dust_animation()
var/atom/movable/overlay/animation = null
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
// flick("dust-m", animation)
new /obj/effect/decal/cleanable/ash(loc)
QDEL_IN(animation, 15)
+84 -87
View File
@@ -1,6 +1,53 @@
// At minimum every mob has a hear_say proc.
/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
/mob/proc/combine_message(var/list/message_pieces, var/verb, var/mob/speaker, always_stars = FALSE)
var/iteration_count = 0
var/msg = "" // This is to make sure that the pieces have actually added something
. = "[verb], \""
for(var/datum/multilingual_say_piece/SP in message_pieces)
iteration_count++
var/piece = SP.message
if(piece == "")
continue
if(SP.speaking && SP.speaking.flags & INNATE) // Fucking snowflake noise lang
return SP.speaking.format_message(piece)
if(iteration_count == 1)
piece = capitalize(piece)
if(SP.speaking)
if(!say_understands(speaker, SP.speaking))
if(isanimal(speaker))
var/mob/living/simple_animal/S = speaker
if(LAZYLEN(S.speak))
piece = pick(S.speak)
else
piece = stars(piece)
else
piece = SP.speaking.scramble(piece)
if(always_stars)
piece = stars(piece)
piece = SP.speaking.format_message(piece)
else
if(!say_understands(speaker, null))
piece = stars(piece)
if(isanimal(speaker))
var/mob/living/simple_animal/S = speaker
if(LAZYLEN(S.speak))
piece = pick(S.speak)
if(always_stars)
piece = stars(piece)
piece = "<span class='message'><span class='body'>[piece]</span></span>"
msg += (piece + " ")
if(msg == "")
// There is literally no content left in this message, we need to shut this shit down
. = "" // hear_say will suppress it
else
. = trim(. + trim(msg))
. += "\""
/mob/proc/hear_say(var/list/message_pieces, var/verb = "says", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
if(!client)
return 0
@@ -23,35 +70,18 @@
sound_vol *= 0.5
if(sleeping || stat == UNCONSCIOUS)
hear_sleep(message)
hear_sleep(message_pieces)
return 0
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
if(language && (language.flags & NONVERBAL))
if(!has_vision(information_only = TRUE)) //blind people can't see dumbass
message = stars(message)
if(!speaker || !(speaker in view(src)))
message = stars(message)
if(!say_understands(speaker, language))
if(isanimal(speaker))
var/mob/living/simple_animal/S = speaker
if(S.speak.len)
message = pick(S.speak)
else
message = stars(message)
else
if(language)
message = language.scramble(message)
else
message = stars(message)
var/speaker_name = speaker.name
if(ishuman(speaker))
var/mob/living/carbon/human/H = speaker
speaker_name = H.GetVoice()
var/message = combine_message(message_pieces, verb, speaker)
if(message == "")
return
if(italics)
message = "<i>[message]</i>"
@@ -66,74 +96,47 @@
message = "<b>[message]</b>"
if(!can_hear())
if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set
if(speaker == src)
to_chat(src, "<span class='warning'>You cannot hear yourself speak!</span>")
else
to_chat(src, "<span class='name'>[speaker_name]</span>[speaker.GetAltName()] talks but you cannot hear [speaker.p_them()].")
else
if(language)
to_chat(src, "<span class='game say'><span class='name'>[speaker_name]</span>[speaker.GetAltName()] [track][language.format_message(message, verb)]</span>")
// INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set
// if(!language || !(language.flags & INNATE))
if(speaker == src)
to_chat(src, "<span class='warning'>You cannot hear yourself speak!</span>")
else
to_chat(src, "<span class='game say'><span class='name'>[speaker_name]</span>[speaker.GetAltName()] [track][verb], <span class='message'><span class='body'>\"[message]\"</span></span></span>")
to_chat(src, "<span class='name'>[speaker_name]</span>[speaker.GetAltName()] talks but you cannot hear [speaker.p_them()].")
else
to_chat(src, "<span class='game say'><span class='name'>[speaker_name]</span>[speaker.GetAltName()] [track][message]</span>")
if(speech_sound && (get_dist(speaker, src) <= world.view && src.z == speaker.z))
var/turf/source = speaker? get_turf(speaker) : get_turf(src)
src.playsound_local(source, speech_sound, sound_vol, 1)
/mob/proc/hear_radio(var/message, var/verb = "says", var/datum/language/language = null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname = "", var/atom/follow_target)
/mob/proc/hear_radio(list/message_pieces, verb = "says", part_a, part_b, mob/speaker = null, hard_to_hear = 0, vname = "", atom/follow_target)
if(!client)
return
if(sleeping || stat == UNCONSCIOUS) //If unconscious or sleeping
hear_sleep(message)
hear_sleep(multilingual_to_message(message_pieces))
return
var/message = combine_message(message_pieces, verb, speaker, always_stars = hard_to_hear)
if(message == "")
return
var/track = null
if(!follow_target)
follow_target = speaker
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
if(language && (language.flags & NONVERBAL))
if(!has_vision(information_only=TRUE)) //blind people can't see dumbass
message = stars(message)
if(!speaker || !(speaker in view(src)))
message = stars(message)
if(!say_understands(speaker, language))
if(isanimal(speaker))
var/mob/living/simple_animal/S = speaker
if(S.speak && S.speak.len)
message = pick(S.speak)
else
return
else
if(language)
message = language.scramble(message)
else
message = stars(message)
if(hard_to_hear)
message = stars(message)
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)
track = handle_track(message, verb, speaker, speaker_name, follow_target, hard_to_hear)
var/formatted
if(language)
formatted = language.format_message_radio(message, verb)
else
formatted = "[verb], <span class=\"body\">\"[message]\"</span>"
if(!can_hear())
if(prob(20))
to_chat(src, "<span class='warning'>You feel your headset vibrate but can hear nothing from it!</span>")
else if(track)
to_chat(src, "[part_a][track][part_b][formatted]</span></span>")
to_chat(src, "[part_a][track][part_b][message]</span></span>")
else
to_chat(src, "[part_a][speaker_name][part_b][formatted]</span></span>")
to_chat(src, "[part_a][speaker_name][part_b][message]</span></span>")
/mob/proc/handle_speaker_name(var/mob/speaker = null, var/vname, var/hard_to_hear)
/mob/proc/handle_speaker_name(mob/speaker = null, vname, hard_to_hear)
var/speaker_name = "unknown"
if(speaker)
speaker_name = speaker.name
@@ -146,26 +149,10 @@
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)
/mob/proc/handle_track(message, verb = "says", mob/speaker = null, speaker_name, atom/follow_target, hard_to_hear)
return
/mob/proc/hear_signlang(var/message, var/verb = "gestures", var/datum/language/language, var/mob/speaker = null)
if(!client)
return
if(say_understands(speaker, language))
message = "<B>[src]</B> [verb], \"[message]\""
else
message = "<B>[src]</B> [verb]."
if(src.status_flags & PASSEMOTES)
for(var/obj/item/holder/H in src.contents)
H.show_message(message)
for(var/mob/living/M in src.contents)
M.show_message(message)
src.show_message(message)
/mob/proc/hear_sleep(var/message)
/mob/proc/hear_sleep(message)
var/heard = ""
if(prob(15))
message = strip_html_properly(message)
@@ -177,9 +164,19 @@
heardword = copytext(heardword,2)
if(copytext(heardword,-1) in punctuation)
heardword = copytext(heardword,1,lentext(heardword))
heard = "<span class = 'game_say'>...You hear something about...[heardword]</span>"
heard = "<span class='game say'>...<i>You hear something about<i>... '[heardword]'...</span>"
else
heard = "<span class = 'game_say'>...<i>You almost hear someone talking</i>...</span>"
heard = "<span class='game say'>...<i>You almost hear someone talking</i>...</span>"
to_chat(src, heard)
/mob/proc/hear_holopad_talk(list/message_pieces, var/verb = "says", var/mob/speaker = null)
var/message = combine_message(message_pieces, verb, speaker)
var/name = speaker.name
if(!say_understands(speaker))
name = speaker.voice_name
var/rendered = "<span class='game say'><span class='name'>[name]</span> [message]</span>"
to_chat(src, rendered)
+10 -13
View File
@@ -11,7 +11,6 @@
var/ask_verb = "asks" // Used when sentence ends in a ?
var/exclaim_verb = "exclaims" // Used when sentence ends in a !
var/whisper_verb // Optional. When not specified speech_verb + quietly/softly is used instead.
var/signlang_verb = list() // list of emotes that might be displayed if this language has NONVERBAL or SIGNLANG flags
var/colour = "body" // CSS style to use for strings in this language.
var/key = "x" // Character used to speak in language eg. :o for Unathi.
var/flags = 0 // Various language flags.
@@ -85,11 +84,11 @@
return scrambled_text
/datum/language/proc/format_message(message, verb)
return "[verb], <span class='message'><span class='[colour]'>\"[capitalize(message)]\"</span></span>"
/datum/language/proc/format_message(message)
return "<span class='message'><span class='[colour]'>[message]</span></span>"
/datum/language/proc/format_message_radio(message, verb)
return "[verb], <span class='[colour]'>\"[capitalize(message)]\"</span>"
/datum/language/proc/format_message_radio(message)
return "<span class='[colour]'>[message]</span>"
/datum/language/proc/get_talkinto_msg_range(message)
// if you yell, you'll be heard from two tiles over instead of one
@@ -103,11 +102,11 @@
if(!speaker_mask)
speaker_mask = speaker.name
var/msg = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span> [format_message(message, get_spoken_verb(message))]</span></i>"
var/msg = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span> [get_spoken_verb(message)], [format_message(message)]</span></i>"
for(var/mob/player in GLOB.player_list)
if(istype(player,/mob/dead) && follow)
var/msg_dead = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span> ([ghost_follow_link(speaker, ghost=player)]) [format_message(message, get_spoken_verb(message))]</span></i>"
var/msg_dead = "<i><span class='game say'>[name], <span class='name'>[speaker_mask]</span> ([ghost_follow_link(speaker, ghost=player)]) [get_spoken_verb(message)], [format_message(message)]</span></i>"
to_chat(player, msg_dead)
continue
@@ -135,10 +134,10 @@
key = ""
flags = RESTRICTED|NONGLOBAL|INNATE|NO_TALK_MSG|NO_STUTTER
/datum/language/noise/format_message(message, verb)
/datum/language/noise/format_message(message)
return "<span class='message'><span class='[colour]'>[message]</span></span>"
/datum/language/noise/format_message_radio(message, verb)
/datum/language/noise/format_message_radio(message)
return "<span class='[colour]'>[message]</span>"
/datum/language/noise/get_talkinto_msg_range(message)
@@ -635,10 +634,9 @@
// Language handling.
/mob/proc/add_language(language)
var/datum/language/new_language = GLOB.all_languages[language]
if(!istype(new_language) || new_language in languages)
if(!istype(new_language) || (new_language in languages))
return FALSE
languages |= new_language
@@ -657,8 +655,7 @@
// Can we speak this language, as opposed to just understanding it?
/mob/proc/can_speak_language(datum/language/speaking)
return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in languages)
return universal_speak || (speaking && speaking.flags & INNATE) || (speaking in languages)
//TBD
/mob/proc/check_lang_data()
+11 -1
View File
@@ -1,4 +1,4 @@
/mob/living/proc/handle_autohiss(message, datum/language/L)
/mob/proc/handle_autohiss(message, datum/language/L)
return message // no autohiss at this level
/mob/living/carbon/human/handle_autohiss(message, datum/language/L)
@@ -58,6 +58,16 @@
)
autohiss_exempt = list("Chittin")
/datum/species/drask
autohiss_basic_map = list(
"o" = list ("oo", "ooo"),
"u" = list ("uu", "uuu")
)
autohiss_extra_map = list(
"m" = list ("mm", "mmm")
)
autohiss_exempt = list("Orluum")
/datum/species/proc/handle_autohiss(message, datum/language/lang, mode)
if(!autohiss_basic_map)
@@ -171,11 +171,11 @@
//Lasertag bullshit
if(lasercolor)
if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
if((istype(r_hand,/obj/item/gun/energy/laser/redtag)) || (istype(l_hand,/obj/item/gun/energy/laser/redtag)))
if((istype(r_hand,/obj/item/gun/energy/laser/tag/red)) || (istype(l_hand,/obj/item/gun/energy/laser/tag/red)))
threatcount += 4
if(lasercolor == "r")
if((istype(r_hand,/obj/item/gun/energy/laser/bluetag)) || (istype(l_hand,/obj/item/gun/energy/laser/bluetag)))
if((istype(r_hand,/obj/item/gun/energy/laser/tag/blue)) || (istype(l_hand,/obj/item/gun/energy/laser/tag/blue)))
threatcount += 4
return threatcount
+15 -10
View File
@@ -1,4 +1,6 @@
/mob/living/carbon/alien/gib()
if(!death(TRUE) && stat != DEAD)
return FALSE
death(1)
var/atom/movable/overlay/animation = null
notransform = 1
@@ -17,30 +19,33 @@
xgibs(loc)
GLOB.dead_mob_list -= src
spawn(15)
if(animation) qdel(animation)
if(src) qdel(src)
QDEL_IN(animation, 15)
QDEL_IN(src, 15)
return TRUE
/mob/living/carbon/alien/dust()
death(1)
var/atom/movable/overlay/animation = null
if(!death(TRUE) && stat != DEAD)
return FALSE
notransform = 1
canmove = 0
icon = null
invisibility = 101
dust_animation()
new /obj/effect/decal/remains/xeno(loc)
GLOB.dead_mob_list -= src
QDEL_IN(src, 15)
return TRUE
/mob/living/carbon/alien/dust_animation()
var/atom/movable/overlay/animation = null
animation = new(loc)
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = src
flick("dust-a", animation)
new /obj/effect/decal/remains/xeno(loc)
GLOB.dead_mob_list -= src
spawn(15)
if(animation) qdel(animation)
if(src) qdel(src)
QDEL_IN(animation, 15)
/mob/living/carbon/alien/death(gibbed)
// Only execute the below if we successfully died
+4 -4
View File
@@ -29,7 +29,7 @@
to_chat(usr, "<span class='warning'>You cannot speak, as your internal speaker is turned off.</span>")
. = FALSE
/mob/living/carbon/brain/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios)
/mob/living/carbon/brain/handle_message_mode(var/message_mode, list/message_pieces, var/verb, var/used_radios)
switch(message_mode)
if("headset")
var/radio_worked = 0 // If any of the radios our brainmob could use functioned, this is set true so that we don't use any others
@@ -39,12 +39,12 @@
if(!radio_worked && c.mecha)
var/obj/mecha/metalgear = c.mecha
if(metalgear.radio)
radio_worked = metalgear.radio.talk_into(src, message, message_mode, verb, speaking)
radio_worked = metalgear.radio.talk_into(src, message_pieces, message_mode, verb)
else if(!radio_worked && c.radio)
radio_worked = c.radio.talk_into(src, message, message_mode, verb, speaking)
radio_worked = c.radio.talk_into(src, message_pieces, message_mode, verb)
return radio_worked
if("whisper")
whisper_say(message, speaking)
whisper_say(message_pieces)
return 1
else return 0
+8 -2
View File
@@ -119,6 +119,9 @@
return 1
/mob/living/carbon/gib()
. = death(1)
if(!.)
return
for(var/obj/item/organ/internal/I in internal_organs)
if(isturf(loc))
I.remove(src)
@@ -130,7 +133,6 @@
src.stomach_contents.Remove(M)
M.forceMove(get_turf(src))
visible_message("<span class='danger'>[M] bursts out of [src]!</span>")
. = ..()
/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, override = 0, tesla_shock = 0)
if(status_flags & GODMODE) //godmode
@@ -356,11 +358,15 @@
else
to_chat(src, "<span class='warning'>Your eyes are really starting to hurt. This can't be good for you!</span>")
if(mind && has_bane(BANE_LIGHT))
mind.disrupt_spells(-500)
return 1
else if(damage == 0) // just enough protection
if(prob(20))
to_chat(src, "<span class='notice'>Something bright flashes in the corner of your vision!</span>")
if(mind && has_bane(BANE_LIGHT))
mind.disrupt_spells(0)
/mob/living/carbon/proc/tintcheck()
@@ -574,7 +580,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(thrown_thing)
visible_message("<span class='danger'>[src] has thrown [thrown_thing].</span>")
newtonian_move(get_dir(target, src))
thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src)
thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src, null, null, null, move_force)
/mob/living/carbon/can_use_hands()
if(handcuffed)
@@ -464,3 +464,12 @@
valid_alt_heads += alternate_head
return valid_alt_heads
/mob/living/carbon/human/proc/scramble_appearance()
scramble(1, src, 100)
real_name = random_name(gender, dna.species.name) //Give them a name that makes sense for their species.
sync_organ_dna(assimilate = 1)
update_body(0)
reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
reset_markings() //...Or markings.
dna.ResetUIFrom(src)
+16 -3
View File
@@ -50,11 +50,16 @@
/mob/living/carbon/human/dust()
if(!death(TRUE) && stat != DEAD)
return FALSE
var/atom/movable/overlay/animation = null
notransform = 1
canmove = 0
icon = null
invisibility = 101
dust_animation()
QDEL_IN(src, 15)
return TRUE
/mob/living/carbon/human/dust_animation()
var/atom/movable/overlay/animation = null
animation = new(loc)
animation.icon_state = "blank"
@@ -63,7 +68,6 @@
flick("dust-h", animation)
new dna.species.remains_type(get_turf(src))
QDEL_IN(src, 0)
QDEL_IN(animation, 15)
return TRUE
@@ -88,7 +92,7 @@
return TRUE
/mob/living/carbon/human/death(gibbed)
if(can_die() && !gibbed)
if(can_die() && !gibbed && deathgasp_on_death)
emote("deathgasp") //let the world KNOW WE ARE DEAD
// Only execute the below if we successfully died
@@ -176,3 +180,12 @@
ChangeToHusk()
mutations |= NOCLONE
return
/mob/living/carbon/human/proc/cure_husk()
mutations.Remove(HUSK)
var/obj/item/organ/external/head/H = bodyparts_by_name["head"]
if(istype(H))
H.disfigured = FALSE
update_body(0)
update_mutantrace(0)
UpdateAppearance() // reset hair from DNA
@@ -832,11 +832,7 @@
message = "<span class='danger'><b>[src]</b> snaps [p_their()] fingers right off!</span>"
playsound(loc, 'sound/effects/snap.ogg', 50, 1)
// Needed for M_TOXIC_FART
if("fart", "farts")
if(reagents.has_reagent("simethicone"))
return
// playsound(loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins still vote no to fun
if(locate(/obj/item/storage/bible) in get_turf(src))
to_chat(viewers(src), "<span class='danger'>[src] farts on the Bible!</span>")
var/image/cross = image('icons/obj/storage.dmi', "bible")
@@ -844,29 +840,10 @@
for(var/client/X in GLOB.admins)
if(check_rights(R_EVENT, 0, X.mob))
to_chat(X, adminbfmessage)
else if(TOXIC_FARTS in mutations)
message = "<b>[src]</b> unleashes a [pick("horrible", "terrible", "foul", "disgusting", "awful")] fart."
else if(SUPER_FART in mutations)
message = "<b>[src]</b> unleashes a [pick("loud", "deafening")] fart."
else
message = "<b>[src]</b> [pick("passes wind", "farts")]."
m_type = 2
var/turf/location = get_turf(src)
// Process toxic farts first.
if(TOXIC_FARTS in mutations)
for(var/mob/living/carbon/C in range(location, 2))
if(C.internal != null && C.wear_mask && (C.wear_mask.flags & AIRTIGHT))
continue
if(C == src)
continue
C.reagents.add_reagent("jenkem", 1)
// Farting as a form of locomotion in space
if(SUPER_FART in mutations)
newtonian_move(dir)
if("hem")
message = "<b>[src]</b> hems."
@@ -363,8 +363,8 @@
for(var/datum/data/record/R in data_core.security)
if(R.fields["id"] == E.fields["id"])
criminal = R.fields["criminal"]
msg += "<span class = 'deptradio'>Criminal status:</span> <a href='?src=[UID()];criminal=1'>\[[criminal]\]</a>\n"
var/criminal_status = hasHUD(user, "read_only_security") ? "\[[criminal]\]" : "<a href='?src=[UID()];criminal=[glasses]'>\[[criminal]\]</a>"
msg += "<span class = 'deptradio'>Criminal status:</span> [criminal_status]\n"
msg += "<span class = 'deptradio'>Security records:</span> <a href='?src=[UID()];secrecord=`'>\[View\]</a> <a href='?src=[UID()];secrecordadd=`'>\[Add comment\]</a>\n"
if(hasHUD(user,"medical"))
@@ -408,7 +408,12 @@
var/obj/item/organ/internal/cyberimp/eyes/hud/CIH = H.get_int_organ(/obj/item/organ/internal/cyberimp/eyes/hud)
switch(hudtype)
if("security")
return istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/hud/security/sunglasses) || istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/security)
return istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/security)
if("read_only_security")
var/obj/item/clothing/glasses/hud/security/S
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security))
S = H.glasses
return !istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/security) && S && S.read_only
if("medical")
return istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(H.glasses, /obj/item/clothing/glasses/hud/health/health_advanced) || istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/medical)
else
+56 -6
View File
@@ -4,6 +4,7 @@
voice_name = "unknown"
icon = 'icons/mob/human.dmi'
icon_state = "body_m_s"
deathgasp_on_death = TRUE
var/obj/item/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
/mob/living/carbon/human/New(loc)
@@ -733,7 +734,7 @@
found_record = 1
if(R.fields["criminal"] == "*Execute*")
to_chat(usr, "<span class='warning'>Unable to modify the sec status of a person with an active Execution order. Use a security computer instead.</span>")
else
else
var/rank
if(ishuman(usr))
var/mob/living/carbon/human/U = usr
@@ -1179,7 +1180,6 @@
restore_all_organs() //Rejuvenate and reset all existing organs.
check_and_regenerate_organs(src) //Regenerate limbs and organs only if they're really missing.
surgeries.Cut() //End all surgeries.
update_revive()
if(!isskeleton(src) && (SKELETON in mutations))
mutations.Remove(SKELETON)
@@ -1567,17 +1567,17 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
if(istype(wear_suit, /obj/item/clothing/suit/redtag))
threatcount += 4
if((istype(r_hand,/obj/item/gun/energy/laser/redtag)) || (istype(l_hand,/obj/item/gun/energy/laser/redtag)))
if((istype(r_hand,/obj/item/gun/energy/laser/tag/red)) || (istype(l_hand,/obj/item/gun/energy/laser/tag/red)))
threatcount += 4
if(istype(belt, /obj/item/gun/energy/laser/redtag))
if(istype(belt, /obj/item/gun/energy/laser/tag/red))
threatcount += 2
if(lasercolor == "r")
if(istype(wear_suit, /obj/item/clothing/suit/bluetag))
threatcount += 4
if((istype(r_hand,/obj/item/gun/energy/laser/bluetag)) || (istype(l_hand,/obj/item/gun/energy/laser/bluetag)))
if((istype(r_hand,/obj/item/gun/energy/laser/tag/blue)) || (istype(l_hand,/obj/item/gun/energy/laser/tag/blue)))
threatcount += 4
if(istype(belt, /obj/item/gun/energy/laser/bluetag))
if(istype(belt, /obj/item/gun/energy/laser/tag/blue))
threatcount += 2
return threatcount
@@ -1942,3 +1942,53 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
/mob/living/carbon/human/proc/special_post_clone_handling()
if(mind && mind.assigned_role == "Cluwne") //HUNKE your suffering never stops
makeCluwne()
/mob/living/carbon/human/proc/influenceSin()
var/datum/objective/sintouched/O
switch(rand(1,7))//traditional seven deadly sins... except lust.
if(1) // acedia
log_game("[src] was influenced by the sin of Acedia.")
O = new /datum/objective/sintouched/acedia
if(2) // Gluttony
log_game("[src] was influenced by the sin of gluttony.")
O = new /datum/objective/sintouched/gluttony
if(3) // Greed
log_game("[src] was influenced by the sin of greed.")
O = new /datum/objective/sintouched/greed
if(4) // sloth
log_game("[src] was influenced by the sin of sloth.")
O = new /datum/objective/sintouched/sloth
if(5) // Wrath
log_game("[src] was influenced by the sin of wrath.")
O = new /datum/objective/sintouched/wrath
if(6) // Envy
log_game("[src] was influenced by the sin of envy.")
O = new /datum/objective/sintouched/envy
if(7) // Pride
log_game("[src] was influenced by the sin of pride.")
O = new /datum/objective/sintouched/pride
ticker.mode.sintouched += src.mind
src.mind.objectives += O
var/obj_count = 1
to_chat(src, "<span class='notice> Your current objectives:")
for(var/datum/objective/objective in src.mind.objectives)
to_chat(src, "<B>Objective #[obj_count]</B>: [objective.explanation_text]")
obj_count++
/mob/living/carbon/human/is_literate()
return getBrainLoss() < 100
/mob/living/carbon/human/fakefire(var/fire_icon = "Generic_mob_burning")
if(!overlays_standing[FIRE_LAYER])
overlays_standing[FIRE_LAYER] = image("icon"=fire_dmi, "icon_state"=fire_icon)
update_icons()
/mob/living/carbon/human/fakefireextinguish()
overlays_standing[FIRE_LAYER] = null
update_icons()
/mob/living/carbon/human/proc/cleanSE() //remove all disabilities/powers
for(var/block = 1; block <= DNA_SE_LENGTH; block++)
dna.SetSEState(block, FALSE, TRUE)
genemutcheck(src, block, null, MUTCHK_FORCED)
dna.UpdateSE()
@@ -233,7 +233,6 @@
var/obj/item/organ/external/picked = pick(parts)
if(picked.receive_damage(brute, burn, sharp, updating_health))
UpdateDamageIcon()
speech_problem_flag = 1
//Heal MANY external organs, in random order
@@ -256,7 +255,6 @@
if(updating_health)
updatehealth("heal overall damage")
speech_problem_flag = 1
if(update)
UpdateDamageIcon()
@@ -224,6 +224,8 @@ emp_act
send_item_attack_message(I, user, hit_area)
var/weakness = check_weakness(I,user)
if(!I.force)
return 0 //item force is zero
@@ -231,12 +233,11 @@ emp_act
var/weapon_sharp = is_sharp(I)
if(weapon_sharp && prob(getarmor(user.zone_sel.selecting, "melee")))
weapon_sharp = 0
if(armor >= 100)
return 0
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
apply_damage(I.force, I.damtype, affecting, armor, sharp = weapon_sharp, used_weapon = I)
apply_damage(I.force * weakness, I.damtype, affecting, armor, sharp = weapon_sharp, used_weapon = I)
var/bloody = 0
if(I.damtype == BRUTE && I.force && prob(25 + I.force * 2))
@@ -42,8 +42,6 @@ var/global/default_martial_art = new/datum/martial_art
var/voice = "" //Instead of new say code calling GetVoice() over and over and over, we're just going to ask this variable, which gets updated in Life()
var/speech_problem_flag = 0
var/datum/personal_crafting/handcrafting
var/datum/martial_art/martial_art = null
@@ -13,6 +13,8 @@
var/obj/item/tank/jetpack/thrust
if(istype(back,/obj/item/tank/jetpack))
thrust = back
else if(istype(s_store,/obj/item/tank/jetpack))
thrust = s_store
else if(istype(back,/obj/item/rig))
var/obj/item/rig/rig = back
for(var/obj/item/rig_module/maneuvering_jets/module in rig.installed_modules)
@@ -85,6 +87,13 @@
if(!(step_count % 2)) //every other turf makes a sound
return 0
if(istype(shoes, /obj/item/clothing/shoes))
var/obj/item/clothing/shoes/shooess = shoes
if(shooess.silence_steps)
return 0 //silent
if(shooess.shoe_sound)
return //Handle it on the shoe
var/range = -(world.view - 2)
if(m_intent == MOVE_INTENT_WALK)
range -= 0.333
@@ -104,11 +113,6 @@
if(!shoes)
volume -= 4
if(istype(shoes, /obj/item/clothing/shoes))
var/obj/item/clothing/shoes/shooess = shoes
if(shooess.silence_steps)
return 0 //silent
if(!has_organ("l_foot") && !has_organ("r_foot"))
return 0 //no feet no footsteps
@@ -580,14 +580,14 @@
return FALSE
saveVoice()
/mob/living/carbon/human/interactive/hear_say(message, verb = "says", datum/language/language = null, italics = 0, mob/speaker = null, sound/speech_sound, sound_vol)
/mob/living/carbon/human/interactive/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol)
if(!istype(speaker, /mob/living/carbon/human/interactive))
knownStrings |= html_decode(message)
knownStrings |= html_decode(multilingual_to_message(message_pieces))
..()
/mob/living/carbon/human/interactive/hear_radio(message, verb = "says", datum/language/language=null, part_a, part_b, mob/speaker = null, hard_to_hear = 0, vname = "", atom/follow_target)
/mob/living/carbon/human/interactive/hear_radio(list/message_pieces, verb = "says", part_a, part_b, mob/speaker = null, hard_to_hear = 0, vname = "", atom/follow_target)
if(!istype(speaker, /mob/living/carbon/human/interactive))
knownStrings |= html_decode(message)
knownStrings |= html_decode(multilingual_to_message(message_pieces))
..()
/mob/living/carbon/human/interactive/proc/doProcess()
@@ -321,7 +321,7 @@
if(put_in_active_hand(W)) return 1
else if(put_in_inactive_hand(W)) return 1
else
..()
. = ..()
// Return the item currently in the slot ID
/mob/living/carbon/human/get_item_by_slot(slot_id)
@@ -71,7 +71,6 @@
drop_item()
emote("cough")
if(disabilities & TOURETTES)
speech_problem_flag = 1
if((prob(10) && paralysis <= 1))
Stun(10)
switch(rand(1, 3))
@@ -86,12 +85,10 @@
animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y), time = 1)
if(disabilities & NERVOUS)
speech_problem_flag = 1
if(prob(10))
Stuttering(10)
if(getBrainLoss() >= 60 && stat != DEAD)
speech_problem_flag = 1
if(prob(3))
var/list/s1 = list("IM A [pick("PONY","LIZARD","taJaran","kitty","Vulpakin","drASK","BIRDIE","voxxie","race car","combat meCH","SPESSSHIP")] [pick("NEEEEEEIIIIIIIIIGH","sKREEEEEE","MEOW","NYA~","rawr","Barkbark","Hissssss","vROOOOOM","pewpew","choo Choo")]!",
"without oxigen blob don't evoluate?",
@@ -158,7 +155,6 @@
if(!gene.block)
continue
if(gene.is_active(src))
speech_problem_flag = 1
gene.OnMobLife(src)
if(!ignore_gene_stability && gene_stability < GENETIC_DAMAGE_STAGE_1)
var/instability = DEFAULT_GENE_STABILITY - gene_stability
@@ -741,7 +737,6 @@
stat = UNCONSCIOUS
else if(sleeping)
speech_problem_flag = 1
stat = UNCONSCIOUS
@@ -1003,29 +998,6 @@
This proc below is only called when those HUD elements need to change as determined by the mobs hud_updateflag.
*/
/mob/living/carbon/human/handle_silent()
if(..())
speech_problem_flag = 1
return silent
/mob/living/carbon/human/handle_slurring()
if(..())
speech_problem_flag = 1
return slurring
/mob/living/carbon/human/handle_stunned()
if(..())
speech_problem_flag = 1
return stunned
/mob/living/carbon/human/handle_stuttering()
if(..())
speech_problem_flag = 1
return stuttering
/mob/living/carbon/human/proc/can_heartattack()
if(NO_BLOOD in dna.species.species_traits)
return FALSE
+50 -47
View File
@@ -107,65 +107,68 @@
/mob/living/carbon/human/proc/GetSpecialVoice()
return special_voice
/mob/living/carbon/human/handle_speech_problems(var/message, var/verb)
var/list/returns[3]
var/speech_problem_flag = 0
/mob/living/carbon/human/handle_speech_problems(list/message_pieces, var/verb)
var/span = ""
var/obj/item/organ/internal/cyberimp/brain/speech_translator/translator = locate(/obj/item/organ/internal/cyberimp/brain/speech_translator) in internal_organs
if(translator)
if(translator.active)
span = translator.speech_span
for(var/datum/multilingual_say_piece/S in message_pieces)
S.message = "<span class='[span]'>[S.message]</span>"
verb = translator.speech_verb
return list("verb" = verb)
if(mind)
span = mind.speech_span
if((COMIC in mutations) \
|| (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs) \
|| istype(get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown))
span = "sans"
if(silent || (disabilities & MUTE))
message = ""
speech_problem_flag = 1
if(WINGDINGS in mutations)
span = "wingdings"
if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
var/obj/item/clothing/mask/horsehead/hoers = wear_mask
if(hoers.voicechange)
message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
verb = pick("whinnies","neighs", "says")
speech_problem_flag = 1
var/list/parent = ..()
verb = parent["verb"]
if(dna)
for(var/datum/dna/gene/gene in dna_genes)
if(!gene.block)
continue
if(gene.is_active(src))
message = gene.OnSay(src,message)
speech_problem_flag = 1
for(var/datum/multilingual_say_piece/S in message_pieces)
if(S.speaking && S.speaking.flags & NO_STUTTER)
continue
if(message != "")
var/list/parent = ..()
message = parent[1]
verb = parent[2]
if(parent[3])
speech_problem_flag = 1
if(silent || (disabilities & MUTE))
S.message = ""
if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
var/obj/item/clothing/mask/horsehead/hoers = wear_mask
if(hoers.voicechange)
S.message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
verb = pick("whinnies", "neighs", "says")
if(dna)
for(var/datum/dna/gene/gene in dna_genes)
if(!gene.block)
continue
if(gene.is_active(src))
S.message = gene.OnSay(src, S.message)
var/braindam = getBrainLoss()
if(braindam >= 60)
speech_problem_flag = 1
if(prob(braindam/4))
message = stutter(message)
if(prob(braindam / 4))
S.message = stutter(S.message)
verb = "gibbers"
if(prob(braindam))
message = uppertext(message)
S.message = uppertext(S.message)
verb = "yells loudly"
if((COMIC in mutations) || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs) || istype(get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown))
span = "sans"
if(span)
S.message = "<span class='[span]'>[S.message]</span>"
return list("verb" = verb)
if(span)
message = "<span class='[span]'>[message]</span>"
returns[1] = message
returns[2] = verb
returns[3] = speech_problem_flag
return returns
/mob/living/carbon/human/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios)
/mob/living/carbon/human/handle_message_mode(var/message_mode, list/message_pieces, var/verb, var/used_radios)
switch(message_mode)
if("intercom")
for(var/obj/item/radio/intercom/I in view(1, src))
spawn(0)
I.talk_into(src, message, null, verb, speaking)
I.talk_into(src, message_pieces, null, verb)
used_radios += I
if("headset")
@@ -173,13 +176,13 @@
if(isradio(l_ear))
R = l_ear
used_radios += R
if(R.talk_into(src, message, null, verb, speaking))
if(R.talk_into(src, message_pieces, null, verb))
return
if(isradio(r_ear))
R = r_ear
used_radios += R
if(R.talk_into(src, message, null, verb, speaking))
if(R.talk_into(src, message_pieces, null, verb))
return
if("right ear")
@@ -190,7 +193,7 @@
R = r_hand
if(R)
used_radios += R
R.talk_into(src, message, null, verb, speaking)
R.talk_into(src, message_pieces, null, verb)
if("left ear")
var/obj/item/radio/R
@@ -200,21 +203,21 @@
R = l_hand
if(R)
used_radios += R
R.talk_into(src, message, null, verb, speaking)
R.talk_into(src, message_pieces, null, verb)
if("whisper")
whisper_say(message, speaking)
whisper_say(message_pieces)
return 1
else
if(message_mode)
if(isradio(l_ear))
used_radios += l_ear
if(l_ear.talk_into(src, message, message_mode, verb, speaking))
if(l_ear.talk_into(src, message_pieces, message_mode, verb))
return
if(isradio(r_ear))
used_radios += r_ear
if(r_ear.talk_into(src, message, message_mode, verb, speaking))
if(r_ear.talk_into(src, message_pieces, message_mode, verb))
return
/mob/living/carbon/human/handle_speech_sound()
@@ -156,6 +156,9 @@
// Mutant pieces
var/obj/item/organ/internal/ears/mutantears = /obj/item/organ/internal/ears
// Species specific boxes
var/speciesbox
/datum/species/New()
//If the species has eyes, they are the default vision organ
if(!vision_organ && has_organ["eyes"])
@@ -199,7 +202,8 @@
if(ears)
qdel(ears)
ears = new mutantears(H)
if(mutantears)
ears = new mutantears(H)
/datum/species/proc/breathe(mob/living/carbon/human/H)
if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations))
@@ -311,7 +315,7 @@
/datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(attacker_style && attacker_style.help_act(user, target))//adminfu only...
return TRUE
if(target.health >= config.health_threshold_crit)
if(target.health >= config.health_threshold_crit && !(target.status_flags & FAKEDEATH))
target.help_shake_act(user)
return TRUE
else
@@ -725,3 +729,9 @@ It'll return null if the organ doesn't correspond, so include null checks when u
var/picked_species = pick(random_species)
var/datum/species/selected_species = GLOB.all_species[picked_species]
return species_name ? picked_species : selected_species.type
/datum/species/proc/can_hear(mob/living/carbon/human/H)
. = FALSE
var/obj/item/organ/internal/ears/ears = H.get_int_organ(/obj/item/organ/internal/ears)
if(istype(ears) && !ears.deaf)
. = TRUE
@@ -34,6 +34,7 @@
species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN)
clothing_flags = HAS_SOCKS
default_hair_colour = "#000000"
has_gender = FALSE
dietflags = 0 //Diona regenerate nutrition in light and water, no diet necessary
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
skinned_type = /obj/item/stack/sheet/wood
@@ -110,4 +111,4 @@
H.adjustFireLoss(-(light_amount/4))
if(H.nutrition < NUTRITION_LEVEL_STARVING+50)
H.take_overall_damage(10,0)
..()
..()
@@ -35,6 +35,7 @@
species_traits = list(LIPS, IS_WHITELISTED)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT
bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS
has_gender = FALSE
dietflags = DIET_OMNI
cold_level_1 = -1 //Default 260 - Lower is better
@@ -59,4 +60,4 @@
"metabolic strainer" = /obj/item/organ/internal/liver/drask,
"eyes" = /obj/item/organ/internal/eyes/drask, //5 darksight.
"brain" = /obj/item/organ/internal/brain/drask
)
)
@@ -21,11 +21,11 @@
default_genes = list(REMOTE_TALK)
species_traits = list(LIPS, IS_WHITELISTED, CAN_BE_FAT)
species_traits = list(LIPS, IS_WHITELISTED, CAN_BE_FAT, CAN_WINGDINGS)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_BODY_MARKINGS
dietflags = DIET_HERB
has_gender = FALSE
reagent_tag = PROCESS_ORG
blood_color = "#A200FF"
@@ -33,6 +33,7 @@
..()
H.dna.SetSEState(REMOTETALKBLOCK, !remove, 1)
genemutcheck(H, REMOTETALKBLOCK, null, MUTCHK_FORCED)
H.dna.default_blocks.Add(REMOTETALKBLOCK)
/datum/species/grey/water_act(mob/living/carbon/human/H, volume, temperature, source)
..()
@@ -40,12 +41,21 @@
H.emote("scream")
/datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H)
var/speech_pref = H.client.prefs.speciesprefs
if(speech_pref)
H.mind.speech_span = "wingdings"
var/translator_pref = H.client.prefs.speciesprefs
if(translator_pref || ((ismindshielded(H) || J.is_command || J.supervisors == "the captain") && (WINGDINGS in H.mutations)))
if(J.title == "Mime")
return
if(J.title == "Clown")
var/obj/item/organ/internal/cyberimp/brain/speech_translator/clown/implant = new
implant.insert(H)
else
var/obj/item/organ/internal/cyberimp/brain/speech_translator/implant = new
implant.insert(H)
if(!translator_pref)
to_chat(H, "<span class='notice'>A speech translator implant has been installed due to your role on the station.</span>")
/datum/species/grey/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
if(R.id == "sacid")
H.reagents.del_reagent(R.id)
return 0
return ..()
return ..()
@@ -17,4 +17,5 @@
worlds tumultous at best."
reagent_tag = PROCESS_ORG
//Has standard darksight of 2.
//Has standard darksight of 2.

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