mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-22 11:37:40 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into EXTERMINATUSPARTONE
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -276,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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -472,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
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -246,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'
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>")
|
||||
@@ -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."
|
||||
@@ -81,6 +82,11 @@
|
||||
var/footstep = 1 //used for squeeks whilst walking
|
||||
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."
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -479,15 +479,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"
|
||||
@@ -495,13 +495,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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
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/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.
|
||||
@@ -247,6 +248,14 @@
|
||||
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
|
||||
@@ -388,4 +397,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
|
||||
|
||||
@@ -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 ////////////
|
||||
//////////////////////////////////
|
||||
@@ -1537,3 +1597,10 @@
|
||||
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"
|
||||
|
||||
|
||||
@@ -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,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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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,13 @@
|
||||
)
|
||||
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
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
@@ -845,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)
|
||||
|
||||
@@ -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,3 +3,6 @@
|
||||
|
||||
/mob/dead/gib() //ghosts can't be gibbed.
|
||||
return
|
||||
|
||||
/mob/dead
|
||||
move_resist = INFINITY
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,9 +92,6 @@
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/human/death(gibbed)
|
||||
if(can_die() && !gibbed)
|
||||
emote("deathgasp") //let the world KNOW WE ARE DEAD
|
||||
|
||||
// Only execute the below if we successfully died
|
||||
. = ..(gibbed)
|
||||
if(!.)
|
||||
@@ -176,3 +177,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."
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -109,14 +109,24 @@
|
||||
|
||||
/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(WINGDINGS in mutations)
|
||||
span = "wingdings"
|
||||
|
||||
var/list/parent = ..()
|
||||
verb = parent["verb"]
|
||||
|
||||
|
||||
@@ -315,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
|
||||
|
||||
@@ -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) && (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 ..()
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
if("Magistrate")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/magistrate
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/magistrate
|
||||
if("Head of Security")
|
||||
if("Head of Security", "Special Operations Officer")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hos
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos
|
||||
if("Captain", "Blueshield")
|
||||
@@ -100,7 +100,7 @@
|
||||
if("Head of Personnel")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hop
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hop
|
||||
if("Nanotrasen Representative")
|
||||
if("Nanotrasen Representative", "Nanotrasen Navy Officer")
|
||||
suit = /obj/item/clothing/suit/space/eva/plasmaman/nt_rep
|
||||
helm = /obj/item/clothing/head/helmet/space/eva/plasmaman/nt_rep
|
||||
if("Medical Doctor","Brig Physician","Virologist")
|
||||
@@ -148,6 +148,9 @@
|
||||
if("Mime")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/mime
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
|
||||
if("Syndicate Officer")
|
||||
suit=/obj/item/clothing/suit/space/eva/plasmaman/nuclear
|
||||
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear
|
||||
|
||||
if((H.mind.special_role == SPECIAL_ROLE_WIZARD) || (H.mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE))
|
||||
H.equip_to_slot(new /obj/item/clothing/suit/space/eva/plasmaman/wizard(H), slot_wear_suit)
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
flesh_color = "#808D11"
|
||||
//Default styles for created mobs.
|
||||
default_hair = "Short Vox Quills"
|
||||
has_gender = FALSE
|
||||
default_hair_colour = "#614f19" //R: 97, G: 79, B: 25
|
||||
butt_sprite = "vox"
|
||||
|
||||
@@ -201,4 +202,4 @@
|
||||
"is huffing oxygen!")
|
||||
|
||||
/datum/species/vox/armalis/handle_reagents() //Skip the Vox oxygen reagent toxicity. Armalis are above such things.
|
||||
return TRUE
|
||||
return TRUE
|
||||
|
||||
@@ -147,7 +147,7 @@ var/global/list/damage_icon_parts = list()
|
||||
E.update_icon()
|
||||
if(E.damage_state == "00")
|
||||
continue
|
||||
|
||||
|
||||
var/icon/DI
|
||||
var/cache_index = "[E.damage_state]/[E.icon_name]/[dna.species.blood_color]/[dna.species.name]"
|
||||
|
||||
@@ -437,7 +437,7 @@ var/global/list/damage_icon_parts = list()
|
||||
else
|
||||
//warning("Invalid f_style for [species.name]: [f_style]")
|
||||
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/human/update_mutations(var/update_icons=1)
|
||||
remove_overlay(MUTATIONS_LAYER)
|
||||
@@ -681,6 +681,8 @@ var/global/list/damage_icon_parts = list()
|
||||
overlays_standing[GLASSES_LAYER] = new_glasses
|
||||
apply_overlay(GLASSES_LAYER)
|
||||
|
||||
update_misc_effects()
|
||||
|
||||
/mob/living/carbon/human/update_inv_ears(var/update_icons=1)
|
||||
remove_overlay(EARS_LAYER)
|
||||
if(client && hud_used)
|
||||
@@ -1035,7 +1037,7 @@ var/global/list/damage_icon_parts = list()
|
||||
/mob/living/carbon/human/proc/update_tail_layer(var/update_icons=1)
|
||||
remove_overlay(TAIL_UNDERLIMBS_LAYER) // SEW direction icons, overlayed by LIMBS_LAYER.
|
||||
remove_overlay(TAIL_LAYER) /* This will be one of two things:
|
||||
If the species' tail is overlapped by limbs, this will be only the N direction icon so tails
|
||||
If the species' tail is overlapped by limbs, this will be only the N direction icon so tails
|
||||
can still appear on the outside of uniforms and such.
|
||||
Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */
|
||||
|
||||
@@ -1110,7 +1112,7 @@ var/global/list/damage_icon_parts = list()
|
||||
/mob/living/carbon/human/proc/start_tail_wagging(var/update_icons=1)
|
||||
remove_overlay(TAIL_UNDERLIMBS_LAYER) // SEW direction icons, overlayed by LIMBS_LAYER.
|
||||
remove_overlay(TAIL_LAYER) /* This will be one of two things:
|
||||
If the species' tail is overlapped by limbs, this will be only the N direction icon so tails
|
||||
If the species' tail is overlapped by limbs, this will be only the N direction icon so tails
|
||||
can still appear on the outside of uniforms and such.
|
||||
Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */
|
||||
|
||||
|
||||
@@ -9,13 +9,15 @@
|
||||
var/class
|
||||
var/list/default_genes = list(REGEN, BREATHLESS, COLDRES)
|
||||
var/list/default_spells = list()
|
||||
|
||||
var/activated = FALSE //for wishgranters to not give an option if someone already has it.
|
||||
|
||||
/datum/superheroes/proc/create(var/mob/living/carbon/human/H)
|
||||
assign_genes(H)
|
||||
assign_spells(H)
|
||||
equip(H)
|
||||
fixflags(H)
|
||||
assign_id(H)
|
||||
H.mind.special_role = SPECIAL_ROLE_SUPER
|
||||
|
||||
/datum/superheroes/proc/equip(var/mob/living/carbon/human/H)
|
||||
H.rename_character(H.real_name, name)
|
||||
|
||||
@@ -56,6 +56,9 @@
|
||||
SetJitter(0)
|
||||
SetLoseBreath(0)
|
||||
|
||||
if(!gibbed && deathgasp_on_death)
|
||||
emote("deathgasp")
|
||||
|
||||
if(suiciding)
|
||||
mind.suicided = TRUE
|
||||
clear_fullscreens()
|
||||
@@ -86,6 +89,8 @@
|
||||
|
||||
if(ticker && ticker.mode)
|
||||
ticker.mode.check_win()
|
||||
if(mind && mind.devilinfo) // Expand this into a general-purpose death-response system when appropriate
|
||||
mind.devilinfo.beginResurrectionCheck(src)
|
||||
|
||||
// u no we dead
|
||||
return TRUE
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if(notransform)
|
||||
return
|
||||
return 0
|
||||
if(!loc)
|
||||
return
|
||||
return 0
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
|
||||
if(stat != DEAD)
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
if(ObjBump(A))
|
||||
return
|
||||
if(istype(A, /atom/movable))
|
||||
if(PushAM(A))
|
||||
if(PushAM(A, move_force))
|
||||
return
|
||||
|
||||
//Called when we bump into a mob
|
||||
@@ -127,32 +127,41 @@
|
||||
return
|
||||
|
||||
//Called when we want to push an atom/movable
|
||||
/mob/living/proc/PushAM(atom/movable/AM)
|
||||
/mob/living/proc/PushAM(atom/movable/AM, force = move_force)
|
||||
if(now_pushing)
|
||||
return 1
|
||||
return TRUE
|
||||
if(moving_diagonally) // no pushing during diagonal moves
|
||||
return 1
|
||||
return TRUE
|
||||
if(!client && (mob_size < MOB_SIZE_SMALL))
|
||||
return
|
||||
if(!AM.anchored)
|
||||
now_pushing = 1
|
||||
var/t = get_dir(src, AM)
|
||||
if(istype(AM, /obj/structure/window))
|
||||
var/obj/structure/window/W = AM
|
||||
if(W.fulltile)
|
||||
for(var/obj/structure/window/win in get_step(W, t))
|
||||
now_pushing = 0
|
||||
return
|
||||
if(pulling == AM)
|
||||
stop_pulling()
|
||||
var/current_dir
|
||||
if(isliving(AM))
|
||||
current_dir = AM.dir
|
||||
step(AM, t)
|
||||
if(current_dir)
|
||||
AM.setDir(current_dir)
|
||||
now_pushing = 0
|
||||
|
||||
now_pushing = TRUE
|
||||
var/t = get_dir(src, AM)
|
||||
var/push_anchored = FALSE
|
||||
if((AM.move_resist * MOVE_FORCE_CRUSH_RATIO) <= force)
|
||||
if(move_crush(AM, move_force, t))
|
||||
push_anchored = TRUE
|
||||
if((AM.move_resist * MOVE_FORCE_FORCEPUSH_RATIO) <= force) //trigger move_crush and/or force_push regardless of if we can push it normally
|
||||
if(force_push(AM, move_force, t, push_anchored))
|
||||
push_anchored = TRUE
|
||||
if((AM.anchored && !push_anchored) || (force < (AM.move_resist * MOVE_FORCE_PUSH_RATIO)))
|
||||
now_pushing = FALSE
|
||||
return
|
||||
if(istype(AM, /obj/structure/window))
|
||||
var/obj/structure/window/W = AM
|
||||
if(W.fulltile)
|
||||
for(var/obj/structure/window/win in get_step(W,t))
|
||||
now_pushing = FALSE
|
||||
return
|
||||
if(pulling == AM)
|
||||
stop_pulling()
|
||||
var/current_dir
|
||||
if(isliving(AM))
|
||||
current_dir = AM.dir
|
||||
if(step(AM, t))
|
||||
step(src, t)
|
||||
if(current_dir)
|
||||
AM.setDir(current_dir)
|
||||
now_pushing = FALSE
|
||||
|
||||
/mob/living/Stat()
|
||||
. = ..()
|
||||
@@ -187,9 +196,20 @@
|
||||
set name = "Pull"
|
||||
set category = "Object"
|
||||
|
||||
if(AM.Adjacent(src))
|
||||
if(istype(AM) && Adjacent(AM))
|
||||
start_pulling(AM)
|
||||
return
|
||||
else
|
||||
stop_pulling()
|
||||
|
||||
/mob/living/stop_pulling()
|
||||
..()
|
||||
if(pullin)
|
||||
pullin.update_icon(src)
|
||||
|
||||
/mob/living/verb/stop_pulling1()
|
||||
set name = "Stop Pulling"
|
||||
set category = "IC"
|
||||
stop_pulling()
|
||||
|
||||
//same as above
|
||||
/mob/living/pointed(atom/A as mob|obj|turf in view())
|
||||
@@ -852,6 +872,37 @@
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/mob/living/start_pulling(atom/movable/AM, state, force = pull_force, supress_message = FALSE)
|
||||
if(!AM || !src)
|
||||
return FALSE
|
||||
if(!(AM.can_be_pulled(src, state, force)))
|
||||
return FALSE
|
||||
if(incapacitated())
|
||||
return
|
||||
// If we're pulling something then drop what we're currently pulling and pull this instead.
|
||||
AM.add_fingerprint(src)
|
||||
if(pulling)
|
||||
if(AM == pulling)// Are we trying to pull something we are already pulling? Then just stop here, no need to continue.
|
||||
return
|
||||
stop_pulling()
|
||||
if(AM.pulledby)
|
||||
visible_message("<span class='danger'>[src] has pulled [AM] from [AM.pulledby]'s grip.</span>")
|
||||
AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
|
||||
pulling = AM
|
||||
AM.pulledby = src
|
||||
if(pullin)
|
||||
pullin.update_icon(src)
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(!iscarbon(src))
|
||||
M.LAssailant = null
|
||||
else
|
||||
M.LAssailant = usr
|
||||
|
||||
/mob/living/proc/check_pull()
|
||||
if(pulling && !(pulling in orange(1)))
|
||||
stop_pulling()
|
||||
|
||||
/mob/living/proc/get_taste_sensitivity()
|
||||
return 1
|
||||
|
||||
@@ -889,3 +940,38 @@
|
||||
return
|
||||
|
||||
to_chat(src, "<span class='notice'>You can taste [english_list(final_taste_list)].</span>")
|
||||
|
||||
/mob/living/proc/owns_soul()
|
||||
if(mind)
|
||||
return mind.soulOwner == mind
|
||||
return 1
|
||||
|
||||
/mob/living/proc/return_soul()
|
||||
if(mind)
|
||||
if(mind.soulOwner.devilinfo)//Not sure how this could happen, but whatever.
|
||||
mind.soulOwner.devilinfo.remove_soul(mind)
|
||||
mind.soulOwner = mind
|
||||
mind.damnation_type = 0
|
||||
|
||||
/mob/living/proc/has_bane(banetype)
|
||||
if(mind)
|
||||
if(mind.devilinfo)
|
||||
return mind.devilinfo.bane == banetype
|
||||
return 0
|
||||
|
||||
/mob/living/proc/check_weakness(obj/item/weapon, mob/living/attacker)
|
||||
if(mind && mind.devilinfo)
|
||||
return check_devil_bane_multiplier(weapon, attacker)
|
||||
return 1
|
||||
|
||||
/mob/living/proc/check_acedia()
|
||||
if(src.mind && src.mind.objectives)
|
||||
for(var/datum/objective/sintouched/acedia/A in src.mind.objectives)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/living/proc/fakefireextinguish()
|
||||
return
|
||||
|
||||
/mob/living/proc/fakefire()
|
||||
return
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
return 0
|
||||
|
||||
//this proc handles being hit by a thrown atom
|
||||
/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked = 0)//Standardization and logging -Sieve
|
||||
/mob/living/hitby(atom/movable/AM, skipcatch, hitpush = 1, blocked = 0, datum/thrownthing/throwingdatum)//Standardization and logging -Sieve
|
||||
if(istype(AM, /obj/item))
|
||||
var/obj/item/I = AM
|
||||
var/zone = ran_zone("chest", 65)//Hits a random part of the body, geared towards the chest
|
||||
@@ -229,7 +229,7 @@
|
||||
|
||||
// End BS12 momentum-transfer code.
|
||||
|
||||
/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = 0)
|
||||
/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = FALSE)
|
||||
if(user == src || anchored)
|
||||
return 0
|
||||
if(!(status_flags & CANPUSH))
|
||||
|
||||
@@ -66,3 +66,5 @@
|
||||
hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
|
||||
|
||||
var/list/status_effects //a list of all status effects the mob has
|
||||
|
||||
var/deathgasp_on_death = FALSE
|
||||
|
||||
@@ -38,7 +38,7 @@ var/list/ai_verbs_default = list(
|
||||
name = "AI"
|
||||
icon = 'icons/mob/AI.dmi'//
|
||||
icon_state = "ai"
|
||||
anchored = 1 // -- TLE
|
||||
move_resist = MOVE_FORCE_VERY_STRONG
|
||||
density = 1
|
||||
status_flags = CANSTUN|CANPARALYSE|CANPUSH
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
@@ -533,9 +533,14 @@ var/list/ai_verbs_default = list(
|
||||
if(!isturf(loc)) // if their location isn't a turf
|
||||
return // stop
|
||||
|
||||
anchored = !anchored // Toggles the anchor
|
||||
var/is_anchored = FALSE
|
||||
if(move_resist == MOVE_FORCE_VERY_STRONG)
|
||||
move_resist = MOVE_FORCE_VERY_STRONG
|
||||
else
|
||||
is_anchored = TRUE
|
||||
move_resist = MOVE_FORCE_NORMAL
|
||||
|
||||
to_chat(src, "[anchored ? "<b>You are now anchored.</b>" : "<b>You are now unanchored.</b>"]")
|
||||
to_chat(src, "[is_anchored ? "<b>You are now anchored.</b>" : "<b>You are now unanchored.</b>"]")
|
||||
|
||||
/mob/living/silicon/ai/update_canmove()
|
||||
return FALSE
|
||||
|
||||
@@ -22,22 +22,23 @@
|
||||
if(src) qdel(src)
|
||||
|
||||
/mob/living/silicon/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()
|
||||
GLOB.dead_mob_list -= src
|
||||
QDEL_IN(src, 15)
|
||||
return TRUE
|
||||
|
||||
/mob/living/silicon/dust_animation()
|
||||
//hmmm
|
||||
var/atom/movable/overlay/animation = null
|
||||
|
||||
animation = new(loc)
|
||||
animation.icon_state = "blank"
|
||||
animation.icon = 'icons/mob/mob.dmi'
|
||||
animation.master = src
|
||||
|
||||
// flick("dust-r", animation)
|
||||
new /obj/effect/decal/remains/robot(loc)
|
||||
|
||||
GLOB.dead_mob_list -= src
|
||||
spawn(15)
|
||||
if(animation) qdel(animation)
|
||||
if(src) qdel(src)
|
||||
QDEL_IN(animation, 15)
|
||||
|
||||
@@ -517,12 +517,8 @@
|
||||
/mob/living/silicon/pai/Bumped()
|
||||
return
|
||||
|
||||
/mob/living/silicon/pai/start_pulling(var/atom/movable/AM)
|
||||
if(stat || sleeping || paralysis || weakened)
|
||||
return
|
||||
if(istype(AM,/obj/item))
|
||||
to_chat(src, "<span class='warning'>You are far too small to pull anything!</span>")
|
||||
return
|
||||
/mob/living/silicon/pai/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE)
|
||||
return FALSE
|
||||
|
||||
/mob/living/silicon/pai/update_canmove(delay_action_updates = 0)
|
||||
. = ..()
|
||||
|
||||
@@ -32,6 +32,32 @@ var/datum/paiController/paiController // Global handler for pAI candidates
|
||||
log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate is not a pAI)")
|
||||
return
|
||||
|
||||
if(href_list["download"])
|
||||
var/obj/item/paicard/card = locate(href_list["device"])
|
||||
if(card.pai)
|
||||
return
|
||||
if(usr.incapacitated() || isobserver(usr) || !card.Adjacent(usr))
|
||||
return
|
||||
if(istype(card, /obj/item/paicard) && istype(candidate, /datum/paiCandidate))
|
||||
var/mob/living/silicon/pai/pai = new(card)
|
||||
if(!candidate.name)
|
||||
pai.name = pick(GLOB.ninja_names)
|
||||
else
|
||||
pai.name = candidate.name
|
||||
pai.real_name = pai.name
|
||||
pai.key = candidate.key
|
||||
|
||||
card.setPersonality(pai)
|
||||
card.looking_for_personality = 0
|
||||
|
||||
ticker.mode.update_cult_icons_removed(card.pai.mind)
|
||||
ticker.mode.update_rev_icons_removed(card.pai.mind)
|
||||
|
||||
pai_candidates -= candidate
|
||||
usr << browse(null, "window=findPai")
|
||||
|
||||
|
||||
if(candidate)
|
||||
if(candidate.key && usr.key && candidate.key != usr.key)
|
||||
message_admins("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)")
|
||||
log_debug("Warning: possible href exploit by [key_name(usr)] (paiController/Topic, candidate and usr are different mobs)")
|
||||
@@ -49,29 +75,6 @@ var/datum/paiController/paiController // Global handler for pAI candidates
|
||||
recruitWindow(O)
|
||||
return
|
||||
|
||||
if(href_list["download"])
|
||||
var/obj/item/paicard/card = locate(href_list["device"])
|
||||
if(card.pai)
|
||||
return
|
||||
if(usr.incapacitated() || isobserver(usr) || !card.Adjacent(usr))
|
||||
return
|
||||
if(istype(card,/obj/item/paicard) && istype(candidate,/datum/paiCandidate))
|
||||
var/mob/living/silicon/pai/pai = new(card)
|
||||
if(!candidate.name)
|
||||
pai.name = pick(GLOB.ninja_names)
|
||||
else
|
||||
pai.name = candidate.name
|
||||
pai.real_name = pai.name
|
||||
pai.key = candidate.key
|
||||
|
||||
card.setPersonality(pai)
|
||||
card.looking_for_personality = 0
|
||||
|
||||
ticker.mode.update_cult_icons_removed(card.pai.mind)
|
||||
ticker.mode.update_rev_icons_removed(card.pai.mind)
|
||||
|
||||
pai_candidates -= candidate
|
||||
usr << browse(null, "window=findPai")
|
||||
|
||||
if(href_list["new"])
|
||||
var/option = href_list["option"]
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
/mob/living/silicon/robot/gib()
|
||||
if(!death(TRUE) && stat != DEAD)
|
||||
return FALSE
|
||||
//robots don't die when gibbed. instead they drop their MMI'd brain
|
||||
var/atom/movable/overlay/animation = null
|
||||
notransform = 1
|
||||
@@ -18,38 +20,35 @@
|
||||
|
||||
GLOB.living_mob_list -= src
|
||||
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/silicon/robot/dust()
|
||||
death(1)
|
||||
var/atom/movable/overlay/animation = null
|
||||
if(!death(TRUE) && stat != DEAD)
|
||||
return FALSE
|
||||
notransform = 1
|
||||
canmove = 0
|
||||
icon = null
|
||||
invisibility = 101
|
||||
if(mmi)
|
||||
qdel(mmi) //Delete the MMI first so that it won't go popping out.
|
||||
GLOB.dead_mob_list -= src
|
||||
QDEL_IN(src, 15)
|
||||
return TRUE
|
||||
|
||||
/mob/living/silicon/robot/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-r", animation)
|
||||
new /obj/effect/decal/remains/robot(loc)
|
||||
if(mmi) qdel(mmi) //Delete the MMI first so that it won't go popping out.
|
||||
|
||||
GLOB.dead_mob_list -= src
|
||||
spawn(15)
|
||||
if(animation) qdel(animation)
|
||||
if(src) qdel(src)
|
||||
|
||||
QDEL_IN(animation, 15)
|
||||
|
||||
/mob/living/silicon/robot/death(gibbed)
|
||||
if(can_die())
|
||||
if(!gibbed)
|
||||
emote("deathgasp")
|
||||
|
||||
if(module)
|
||||
module.handle_death(gibbed)
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ var/list/robot_verbs_default = list(
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
universal_understand = 1
|
||||
deathgasp_on_death = TRUE
|
||||
|
||||
var/sight_mode = 0
|
||||
var/custom_name = ""
|
||||
@@ -1293,61 +1294,6 @@ var/list/robot_verbs_default = list(
|
||||
|
||||
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
|
||||
|
||||
|
||||
|
||||
/mob/living/silicon/robot/syndicate
|
||||
base_icon = "syndie_bloodhound"
|
||||
icon_state = "syndie_bloodhound"
|
||||
lawupdate = 0
|
||||
scrambledcodes = 1
|
||||
pdahide = 1
|
||||
faction = list("syndicate")
|
||||
designation = "Syndicate Assault"
|
||||
modtype = "Syndicate"
|
||||
req_access = list(access_syndicate)
|
||||
ionpulse = 1
|
||||
magpulse = 1
|
||||
lawchannel = "State"
|
||||
var/playstyle_string = "<span class='userdanger'>You are a Syndicate assault cyborg!</span><br>\
|
||||
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
Your cyborg LMG will slowly produce ammunition from your power supply, and your operative pinpointer will find and locate fellow nuclear operatives. \
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
|
||||
/mob/living/silicon/robot/syndicate/New(loc)
|
||||
..()
|
||||
cell.maxcharge = 25000
|
||||
cell.charge = 25000
|
||||
|
||||
/mob/living/silicon/robot/syndicate/init()
|
||||
laws = new /datum/ai_laws/syndicate_override
|
||||
module = new /obj/item/robot_module/syndicate(src)
|
||||
|
||||
aiCamera = new/obj/item/camera/siliconcam/robot_camera(src)
|
||||
radio = new /obj/item/radio/borg/syndicate(src)
|
||||
radio.recalculateChannels()
|
||||
|
||||
spawn(5)
|
||||
if(playstyle_string)
|
||||
to_chat(src, playstyle_string)
|
||||
|
||||
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
|
||||
|
||||
/mob/living/silicon/robot/syndicate/medical
|
||||
base_icon = "syndi-medi"
|
||||
icon_state = "syndi-medi"
|
||||
modtype = "Syndicate Medical"
|
||||
designation = "Syndicate Medical"
|
||||
playstyle_string = "<span class='userdanger'>You are a Syndicate medical cyborg!</span><br>\
|
||||
<b>You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \
|
||||
Your defibrillator paddles can revive operatives through their hardsuits, or can be used on harm intent to shock enemies! \
|
||||
Your energy saw functions as a circular saw, but can be activated to deal more damage, and your operative pinpointer will find and locate fellow nuclear operatives. \
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
|
||||
/mob/living/silicon/robot/syndicate/medical/init()
|
||||
..()
|
||||
module = new /obj/item/robot_module/syndicate_medical(src)
|
||||
|
||||
/mob/living/silicon/robot/combat
|
||||
base_icon = "droidcombat"
|
||||
icon_state = "droidcombat"
|
||||
|
||||
@@ -432,6 +432,46 @@
|
||||
|
||||
fix_modules()
|
||||
|
||||
/obj/item/robot_module/syndicate_saboteur
|
||||
name = "engineering robot module" //to disguise in examine
|
||||
module_type = "Malf"
|
||||
|
||||
stacktypes = list(
|
||||
/obj/item/stack/sheet/metal/cyborg = 50,
|
||||
/obj/item/stack/sheet/glass/cyborg = 50,
|
||||
/obj/item/stack/sheet/rglass/cyborg = 50,
|
||||
/obj/item/stack/cable_coil/cyborg = 50,
|
||||
/obj/item/stack/rods/cyborg = 60,
|
||||
/obj/item/stack/tile/plasteel = 20
|
||||
)
|
||||
|
||||
/obj/item/robot_module/syndicate_saboteur/New()
|
||||
..()
|
||||
modules += new /obj/item/rcd/borg/syndicate(src)
|
||||
modules += new /obj/item/rpd(src)
|
||||
modules += new /obj/item/extinguisher(src)
|
||||
modules += new /obj/item/weldingtool/largetank/cyborg(src)
|
||||
modules += new /obj/item/screwdriver/cyborg(src)
|
||||
modules += new /obj/item/wrench/cyborg(src)
|
||||
modules += new /obj/item/crowbar/cyborg(src)
|
||||
modules += new /obj/item/wirecutters/cyborg(src)
|
||||
modules += new /obj/item/multitool/cyborg(src)
|
||||
modules += new /obj/item/t_scanner(src)
|
||||
modules += new /obj/item/analyzer(src)
|
||||
modules += new /obj/item/gripper(src)
|
||||
modules += new /obj/item/melee/energy/sword/cyborg(src)
|
||||
modules += new /obj/item/card/emag(src)
|
||||
modules += new /obj/item/borg_chameleon(src)
|
||||
modules += new /obj/item/pinpointer/operative(src)
|
||||
emag = null
|
||||
|
||||
for(var/T in stacktypes)
|
||||
var/obj/item/stack/sheet/W = new T(src)
|
||||
W.amount = stacktypes[T]
|
||||
modules += W
|
||||
|
||||
fix_modules()
|
||||
|
||||
/obj/item/robot_module/combat
|
||||
name = "combat robot module"
|
||||
module_type = "Malf"
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
/mob/living/silicon/robot/syndicate
|
||||
base_icon = "syndie_bloodhound"
|
||||
icon_state = "syndie_bloodhound"
|
||||
lawupdate = 0
|
||||
scrambledcodes = 1
|
||||
pdahide = 1
|
||||
faction = list("syndicate")
|
||||
designation = "Syndicate Assault"
|
||||
modtype = "Syndicate"
|
||||
req_access = list(access_syndicate)
|
||||
ionpulse = 1
|
||||
magpulse = 1
|
||||
lawchannel = "State"
|
||||
var/playstyle_string = "<span class='userdanger'>You are a Syndicate assault cyborg!</span><br>\
|
||||
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
Your cyborg LMG will slowly produce ammunition from your power supply, and your operative pinpointer will find and locate fellow nuclear operatives. \
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
|
||||
/mob/living/silicon/robot/syndicate/New(loc)
|
||||
..()
|
||||
cell.maxcharge = 25000
|
||||
cell.charge = 25000
|
||||
|
||||
/mob/living/silicon/robot/syndicate/init()
|
||||
laws = new /datum/ai_laws/syndicate_override
|
||||
module = new /obj/item/robot_module/syndicate(src)
|
||||
|
||||
aiCamera = new/obj/item/camera/siliconcam/robot_camera(src)
|
||||
radio = new /obj/item/radio/borg/syndicate(src)
|
||||
radio.recalculateChannels()
|
||||
|
||||
spawn(5)
|
||||
if(playstyle_string)
|
||||
to_chat(src, playstyle_string)
|
||||
|
||||
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
|
||||
|
||||
/mob/living/silicon/robot/syndicate/medical
|
||||
base_icon = "syndi-medi"
|
||||
icon_state = "syndi-medi"
|
||||
modtype = "Syndicate Medical"
|
||||
designation = "Syndicate Medical"
|
||||
playstyle_string = "<span class='userdanger'>You are a Syndicate medical cyborg!</span><br>\
|
||||
<b>You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \
|
||||
Your defibrillator paddles can revive operatives through their hardsuits, or can be used on harm intent to shock enemies! \
|
||||
Your energy saw functions as a circular saw, but can be activated to deal more damage, and your operative pinpointer will find and locate fellow nuclear operatives. \
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
|
||||
/mob/living/silicon/robot/syndicate/medical/init()
|
||||
..()
|
||||
module = new /obj/item/robot_module/syndicate_medical(src)
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur
|
||||
base_icon = "syndi-engi"
|
||||
icon_state = "syndi-engi"
|
||||
modtype = "Syndicate Saboteur"
|
||||
designation = "Syndicate Saboteur"
|
||||
var/mail_destination = 0
|
||||
var/obj/item/borg_chameleon/cham_proj = null
|
||||
playstyle_string = "<span class='userdanger'>You are a Syndicate saboteur cyborg!</span><br>\
|
||||
<b>You are equipped with robust engineering tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
|
||||
Your built-in mail tagger will allow you to stealthily traverse the disposal network across the station. \
|
||||
Your cyborg chameleon projector allows you to assume the appearance of a Nanotrasen engineering cyborg, and undertake covert actions on the station. \
|
||||
You are able to hijack Nanotrasen cyborgs by emagging their internal components, make sure to flash them first. \
|
||||
You are armed with a standard energy sword, use it to ambush key targets if needed. Your pinpointer will let you locate fellow nuclear operatives to regroup.\
|
||||
Be aware that physical contact or taking damage will break your disguise. \
|
||||
<i>Help the operatives secure the disk at all costs!</i></b>"
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur/init()
|
||||
..()
|
||||
module = new /obj/item/robot_module/syndicate_saboteur(src)
|
||||
var/obj/item/borg/upgrade/selfrepair/SR = new /obj/item/borg/upgrade/selfrepair(src)
|
||||
SR.cyborg = src
|
||||
SR.icon_state = "selfrepair_off"
|
||||
var/datum/action/A = new /datum/action/item_action/toggle(SR)
|
||||
A.Grant(src)
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur/verb/modify_name()
|
||||
set name = "Modify Name"
|
||||
set desc = "Change your systems' registered name to fool Nanotrasen systems. No cost."
|
||||
set category = "Saboteur"
|
||||
rename_self(braintype, TRUE, TRUE)
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur/verb/toggle_chameleon()
|
||||
set name = "Toggle Chameleon Projector"
|
||||
set desc = "Change your appearance to a Nanotrasen cyborg. Costs power to use and maintain."
|
||||
set category = "Saboteur"
|
||||
if(!cham_proj)
|
||||
for(var/obj/item/borg_chameleon/C in contents)
|
||||
cham_proj = C
|
||||
for(var/obj/item/borg_chameleon/C in module.contents)
|
||||
cham_proj = C
|
||||
if(!cham_proj)
|
||||
to_chat(src, "<span class='warning'>Error : No chameleon projector system found.</span>")
|
||||
return
|
||||
cham_proj.attack_self(src)
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur/verb/set_mail_tag()
|
||||
set name = "Set Mail Tag"
|
||||
set desc = "Tag yourself for delivery through the disposals system."
|
||||
set category = "Saboteur"
|
||||
|
||||
var/tag = input("Select the desired destination.", "Set Mail Tag", null) as null|anything in GLOB.TAGGERLOCATIONS
|
||||
|
||||
if(!tag || GLOB.TAGGERLOCATIONS[tag])
|
||||
mail_destination = 0
|
||||
return
|
||||
|
||||
to_chat(src, "<span class='notice'>You configure your internal beacon, tagging yourself for delivery to '[tag]'.</span>")
|
||||
mail_destination = GLOB.TAGGERLOCATIONS.Find(tag)
|
||||
|
||||
//Auto flush if we use this verb inside a disposal chute.
|
||||
var/obj/machinery/disposal/D = src.loc
|
||||
if(istype(D))
|
||||
to_chat(src, "<span class='notice'>\The [D] acknowledges your signal.</span>")
|
||||
D.flush_count = D.flush_every_ticks
|
||||
|
||||
return
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur/attackby()
|
||||
if(cham_proj)
|
||||
cham_proj.disrupt(src)
|
||||
..()
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur/attack_hand()
|
||||
if(cham_proj)
|
||||
cham_proj.disrupt(src)
|
||||
..()
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur/ex_act()
|
||||
if(cham_proj)
|
||||
cham_proj.disrupt(src)
|
||||
..()
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur/emp_act()
|
||||
if(cham_proj)
|
||||
cham_proj.disrupt(src)
|
||||
..()
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur/bullet_act()
|
||||
if(cham_proj)
|
||||
cham_proj.disrupt(src)
|
||||
..()
|
||||
|
||||
/mob/living/silicon/robot/syndicate/saboteur/attackby()
|
||||
if(cham_proj)
|
||||
cham_proj.disrupt(src)
|
||||
..()
|
||||
@@ -329,6 +329,9 @@
|
||||
/mob/living/silicon/is_mechanical()
|
||||
return 1
|
||||
|
||||
/mob/living/silicon/is_literate()
|
||||
return 1
|
||||
|
||||
/////////////////////////////////// EAR DAMAGE ////////////////////////////////////
|
||||
/mob/living/silicon/can_hear()
|
||||
. = TRUE
|
||||
@@ -153,11 +153,11 @@
|
||||
var/newname = ""
|
||||
switch(lasercolor)
|
||||
if("b")
|
||||
if(!istype(W, /obj/item/gun/energy/laser/bluetag))
|
||||
if(!istype(W, /obj/item/gun/energy/laser/tag/blue))
|
||||
return
|
||||
newname = "bluetag ED-209 assembly"
|
||||
if("r")
|
||||
if(!istype(W, /obj/item/gun/energy/laser/redtag))
|
||||
if(!istype(W, /obj/item/gun/energy/laser/tag/red))
|
||||
return
|
||||
newname = "redtag ED-209 assembly"
|
||||
if("")
|
||||
|
||||
@@ -23,28 +23,28 @@
|
||||
path_image_color = "#FF0000"
|
||||
data_hud_type = DATA_HUD_SECURITY_ADVANCED
|
||||
|
||||
allow_pai = 0
|
||||
|
||||
var/lastfired = 0
|
||||
var/shot_delay = 3 //.3 seconds between shots
|
||||
var/lasercolor = ""
|
||||
var/disabled = 0//A holder for if it needs to be disabled, if true it will not seach for targets, shoot at targets, or move, currently only used for lasertag
|
||||
|
||||
|
||||
var/mob/living/carbon/target
|
||||
var/oldtarget_name
|
||||
var/threatlevel = 0
|
||||
var/target_lastloc //Loc of target when arrested.
|
||||
var/last_found //There's a delay
|
||||
var/declare_arrests = 1 //When making an arrest, should it notify everyone wearing sechuds?
|
||||
var/idcheck = 1 //If true, arrest people with no IDs
|
||||
var/idcheck = 0 //If true, arrest people with no IDs
|
||||
var/weaponscheck = 1 //If true, arrest people for weapons if they don't have access
|
||||
var/check_records = 1 //Does it check security records?
|
||||
var/arrest_type = 0 //If true, don't handcuff
|
||||
var/projectile = /obj/item/projectile/energy/electrode //Holder for projectile type
|
||||
var/shoot_sound = 'sound/weapons/taser.ogg'
|
||||
allow_pai = 0
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/New(loc,created_name,created_lasercolor)
|
||||
/mob/living/simple_animal/bot/ed209/New(loc, created_name, created_lasercolor)
|
||||
..()
|
||||
if(created_name)
|
||||
name = created_name
|
||||
@@ -52,29 +52,33 @@
|
||||
lasercolor = created_lasercolor
|
||||
icon_state = "[lasercolor]ed209[on]"
|
||||
set_weapon() //giving it the right projectile and firing sound.
|
||||
spawn(3)
|
||||
var/datum/job/detective/J = new/datum/job/detective
|
||||
access_card.access += J.get_access()
|
||||
prev_access = access_card.access
|
||||
setup_access()
|
||||
|
||||
if(lasercolor)
|
||||
shot_delay = 6//Longer shot delay because JESUS CHRIST
|
||||
check_records = 0//Don't actively target people set to arrest
|
||||
arrest_type = 1//Don't even try to cuff
|
||||
declare_arrests = 0 // Don't spam sec
|
||||
bot_core.req_access = list(access_maint_tunnels, access_theatre, access_robotics)
|
||||
if(lasercolor)
|
||||
shot_delay = 6//Longer shot delay because JESUS CHRIST
|
||||
check_records = 0//Don't actively target people set to arrest
|
||||
arrest_type = 1//Don't even try to cuff
|
||||
declare_arrests = 0 // Don't spam sec
|
||||
bot_core.req_access = list(access_maint_tunnels, access_theatre, access_robotics)
|
||||
|
||||
if(created_name == initial(name) || !created_name)
|
||||
if(lasercolor == "b")
|
||||
name = pick("BLUE BALLER","SANIC","BLUE KILLDEATH MURDERBOT")
|
||||
else if (lasercolor == "r")
|
||||
name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT")
|
||||
if(created_name == initial(name) || !created_name)
|
||||
if(lasercolor == "b")
|
||||
name = pick("BLUE BALLER","SANIC","BLUE KILLDEATH MURDERBOT")
|
||||
else if (lasercolor == "r")
|
||||
name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT")
|
||||
|
||||
//SECHUD
|
||||
var/datum/atom_hud/secsensor = huds[DATA_HUD_SECURITY_ADVANCED]
|
||||
secsensor.add_hud_to(src)
|
||||
permanent_huds |= secsensor
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/proc/setup_access()
|
||||
if(access_card)
|
||||
var/datum/job/detective/J = new/datum/job/detective
|
||||
access_card.access += J.get_access()
|
||||
prev_access = access_card.access
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/turn_on()
|
||||
. = ..()
|
||||
icon_state = "[lasercolor]ed209[on]"
|
||||
@@ -383,11 +387,11 @@
|
||||
G.power_supply.charge = 0
|
||||
G.update_icon()
|
||||
else if(lasercolor == "b")
|
||||
var/obj/item/gun/energy/laser/bluetag/G = new /obj/item/gun/energy/laser/bluetag(Tsec)
|
||||
var/obj/item/gun/energy/laser/tag/blue/G = new /obj/item/gun/energy/laser/tag/blue(Tsec)
|
||||
G.power_supply.charge = 0
|
||||
G.update_icon()
|
||||
else if(lasercolor == "r")
|
||||
var/obj/item/gun/energy/laser/redtag/G = new /obj/item/gun/energy/laser/redtag(Tsec)
|
||||
var/obj/item/gun/energy/laser/tag/red/G = new /obj/item/gun/energy/laser/tag/red(Tsec)
|
||||
G.power_supply.charge = 0
|
||||
G.update_icon()
|
||||
|
||||
@@ -549,18 +553,11 @@
|
||||
icon_state = "[lasercolor]ed209-c"
|
||||
spawn(2)
|
||||
icon_state = "[lasercolor]ed209[on]"
|
||||
var/threat = 5
|
||||
if(istype(C, /mob/living/carbon/human))
|
||||
C.stuttering = 5
|
||||
C.Stun(5)
|
||||
C.Weaken(5)
|
||||
var/mob/living/carbon/human/H = C
|
||||
threat = H.assess_threat(src)
|
||||
else
|
||||
C.Weaken(5)
|
||||
C.stuttering = 5
|
||||
C.Stun(5)
|
||||
add_attack_logs(src, C, "Stunned by [src]")
|
||||
var/threat = C.assess_threat(src)
|
||||
C.SetStuttering(5)
|
||||
C.Stun(5)
|
||||
C.Weaken(5)
|
||||
add_attack_logs(src, C, "stunned")
|
||||
if(declare_arrests)
|
||||
var/area/location = get_area(src)
|
||||
speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag <b>[C]</b> in [location].", radio_channel)
|
||||
@@ -579,4 +576,4 @@
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
|
||||
C.update_handcuffed()
|
||||
back_to_idle()
|
||||
back_to_idle()
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
desc = "A Multiple Utility Load Effector bot."
|
||||
icon_state = "mulebot0"
|
||||
density = 1
|
||||
anchored = 1
|
||||
animate_movement=1
|
||||
move_resist = MOVE_FORCE_STRONG
|
||||
animate_movement = 1
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
|
||||
|
||||
@@ -247,20 +247,13 @@ Auto Patrol: []"},
|
||||
icon_state = "[base_icon]-c"
|
||||
spawn(2)
|
||||
icon_state = "[base_icon][on]"
|
||||
var/threat = 5
|
||||
if(istype(C, /mob/living/carbon/human))
|
||||
C.stuttering = 5
|
||||
if(harmbaton) // Bots with harmbaton enabled become shitcurity. - Dave
|
||||
C.apply_damage(10, BRUTE)
|
||||
C.Stun(5)
|
||||
C.Weaken(5)
|
||||
var/mob/living/carbon/human/H = C
|
||||
threat = H.assess_threat(src)
|
||||
else
|
||||
C.Weaken(5)
|
||||
C.stuttering = 5
|
||||
C.Stun(5)
|
||||
add_attack_logs(src, C, "Stunned by [src]")
|
||||
var/threat = C.assess_threat(src)
|
||||
if(ishuman(C) && harmbaton) // Bots with harmbaton enabled become shitcurity. - Dave
|
||||
C.apply_damage(10, BRUTE)
|
||||
C.SetStuttering(5)
|
||||
C.Stun(5)
|
||||
C.Weaken(5)
|
||||
add_attack_logs(src, C, "stunned")
|
||||
if(declare_arrests)
|
||||
var/area/location = get_area(src)
|
||||
speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag <b>[C]</b> in [location].", radio_channel)
|
||||
|
||||
@@ -29,12 +29,14 @@
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/New()
|
||||
..()
|
||||
if(access_card)
|
||||
access_card.access = list(access_syndicate, access_syndicate_leader)
|
||||
set_weapon()
|
||||
update_icon()
|
||||
spawn_turf = get_turf(src)
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/setup_access()
|
||||
if(access_card)
|
||||
access_card.access = list(access_syndicate, access_syndicate_leader)
|
||||
prev_access = access_card.access
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/update_icon()
|
||||
icon_state = initial(icon_state)
|
||||
@@ -160,7 +162,7 @@
|
||||
P.fire()
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/syndicate/explode()
|
||||
if (!QDELETED(src))
|
||||
if(!QDELETED(src))
|
||||
if(depotarea)
|
||||
depotarea.list_remove(src, depotarea.guard_list)
|
||||
walk_to(src,0)
|
||||
|
||||
@@ -620,4 +620,4 @@
|
||||
. = ..(gibbed)
|
||||
if(!.)
|
||||
return FALSE
|
||||
do_sparks(3, 1, src)
|
||||
do_sparks(3, 1, src)
|
||||
|
||||
@@ -6,9 +6,10 @@
|
||||
icon_living = "mouse_gray"
|
||||
icon_dead = "mouse_gray_dead"
|
||||
speak = list("Squeek!","SQUEEK!","Squeek?")
|
||||
speak_emote = list("squeeks","squeeks","squiks")
|
||||
speak_emote = list("squeeks","squeaks","squiks")
|
||||
emote_hear = list("squeeks","squeaks","squiks")
|
||||
emote_see = list("runs in a circle", "shakes", "scritches at something")
|
||||
var/squeak_sound = 'sound/effects/mousesqueek.ogg'
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
@@ -40,7 +41,7 @@
|
||||
..()
|
||||
if(prob(speak_chance))
|
||||
for(var/mob/M in view())
|
||||
M << 'sound/effects/mousesqueek.ogg'
|
||||
M << squeak_sound
|
||||
|
||||
/mob/living/simple_animal/mouse/Life(seconds, times_fired)
|
||||
. = ..()
|
||||
@@ -71,6 +72,7 @@
|
||||
desc = "It's a small [mouse_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
|
||||
|
||||
/mob/living/simple_animal/mouse/proc/splat()
|
||||
playsound(src, squeak_sound, 40, 1)
|
||||
src.health = 0
|
||||
src.stat = DEAD
|
||||
src.icon_dead = "mouse_[mouse_color]_splat"
|
||||
@@ -93,7 +95,7 @@
|
||||
if(stat == CONSCIOUS)
|
||||
var/mob/M = AM
|
||||
to_chat(M, "<span class='notice'>[bicon(src)] Squeek!</span>")
|
||||
SEND_SOUND(M, 'sound/effects/mousesqueek.ogg')
|
||||
SEND_SOUND(M, squeak_sound)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/mouse/death(gibbed)
|
||||
@@ -105,6 +107,31 @@
|
||||
if(client)
|
||||
client.time_died_as_mouse = world.time
|
||||
|
||||
/mob/living/simple_animal/mouse/emote(act, m_type=1, message = null)
|
||||
if(stat != CONSCIOUS)
|
||||
return
|
||||
|
||||
var/on_CD = 0
|
||||
act = lowertext(act)
|
||||
switch(act)
|
||||
if("squeak") //Mouse time
|
||||
on_CD = handle_emote_CD()
|
||||
else
|
||||
on_CD = 0
|
||||
|
||||
if(on_CD == 1)
|
||||
return
|
||||
|
||||
switch(act)
|
||||
if("squeak")
|
||||
message = "<B>\The [src]</B> squeaks!"
|
||||
m_type = 2 //audible
|
||||
playsound(src, squeak_sound, 40, 1)
|
||||
if("help")
|
||||
to_chat(src, "scream, squeak")
|
||||
|
||||
..()
|
||||
|
||||
/*
|
||||
* Mouse types
|
||||
*/
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/simple_animal/pet/death(gibbed)
|
||||
..()
|
||||
. = ..()
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/simple_animal/pet/regenerate_icons(cut_overlays = 1)
|
||||
@@ -28,4 +28,4 @@
|
||||
overlays.Cut()
|
||||
if(collar)
|
||||
overlays += "[icon_state]collar"
|
||||
overlays += "[icon_state]tag"
|
||||
overlays += "[icon_state]tag"
|
||||
|
||||
@@ -132,6 +132,23 @@
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker
|
||||
//Blank type define in case we need to give them special stuff later, plus organization (currently they are same as base type bee)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/Destroy()
|
||||
if(beehome)
|
||||
if(beehome.bees)
|
||||
beehome.bees.Remove(src)
|
||||
beehome = null
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/death(gibbed)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(beehome)
|
||||
if(beehome.bees)
|
||||
beehome.bees.Remove(src)
|
||||
beehome = null
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/bees/worker/examine(mob/user)
|
||||
..()
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
var/check_friendly_fire = 0 // Should the ranged mob check for friendlies when shooting
|
||||
var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat.
|
||||
var/minimum_distance = 1 //Minimum approach distance, so ranged mobs chase targets down, but still keep their distance set in tiles to the target, set higher to make mobs keep distance
|
||||
|
||||
|
||||
//These vars are related to how mobs locate and target
|
||||
var/robust_searching = 0 //By default, mobs have a simple searching method, set this to 1 for the more scrutinous searching (stat_attack, stat_exclusive, etc), should be disabled on most mobs
|
||||
var/vision_range = 9 //How big of an area to search for targets in, a vision of 9 attempts to find targets as soon as they walk into screen view
|
||||
@@ -41,6 +41,8 @@
|
||||
/obj/structure/grille,
|
||||
/obj/structure/girder,
|
||||
/obj/structure/rack,
|
||||
/obj/structure/computerframe,
|
||||
/obj/machinery/constructable_frame,
|
||||
/obj/structure/barricade) //turned into a typecache in New()
|
||||
var/atom/targets_from = null //all range/attack/etc. calculations should be done from this atom, defaults to the mob itself, useful for Vehicles and such
|
||||
var/list/emote_taunt = list()
|
||||
|
||||
@@ -38,7 +38,9 @@
|
||||
var/elimination = 0
|
||||
var/anger_modifier = 0
|
||||
var/obj/item/gps/internal_gps
|
||||
anchored = TRUE
|
||||
move_force = MOVE_FORCE_OVERPOWERING
|
||||
move_resist = MOVE_FORCE_OVERPOWERING
|
||||
pull_force = MOVE_FORCE_OVERPOWERING
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
layer = MOB_LAYER + 0.5 //Looks weird with them slipping under mineral walls and cameras and shit otherwise
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway
|
||||
|
||||
@@ -136,7 +136,9 @@
|
||||
throw_message = "does nothing to the rocky hide of the"
|
||||
aggro_vision_range = 9
|
||||
idle_vision_range = 5
|
||||
anchored = 1 //Stays anchored until death as to be unpullable
|
||||
move_force = MOVE_FORCE_VERY_STRONG
|
||||
move_resist = MOVE_FORCE_VERY_STRONG
|
||||
pull_force = MOVE_FORCE_VERY_STRONG
|
||||
var/pre_attack = 0
|
||||
loot = list(/obj/item/asteroid/goliath_hide{layer = 4.1})
|
||||
|
||||
@@ -152,7 +154,9 @@
|
||||
icon_state = "Goliath_preattack"
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/revive()
|
||||
anchored = 1
|
||||
move_force = MOVE_FORCE_VERY_STRONG
|
||||
move_resist = MOVE_FORCE_VERY_STRONG
|
||||
pull_force = MOVE_FORCE_VERY_STRONG
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire()
|
||||
|
||||
@@ -29,3 +29,23 @@
|
||||
heat_damage_per_tick = 15 //amount of damage applied if animal's body temperature is higher than maxbodytemp
|
||||
cold_damage_per_tick = 10 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp
|
||||
unsuitable_atmos_damage = 10
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/clown/goblin
|
||||
name = "clown goblin"
|
||||
desc = "A tiny walking mask and clown shoes. You want to honk his nose!"
|
||||
icon_state = "clowngoblin"
|
||||
icon_living = "clowngoblin"
|
||||
icon_dead = null
|
||||
response_help = "honks the"
|
||||
speak = list("Honk!")
|
||||
speak_emote = list("sqeaks")
|
||||
emote_see = list("honks")
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
|
||||
speed = -1
|
||||
turns_per_move = 1
|
||||
|
||||
del_on_death = TRUE
|
||||
loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/item/clothing/shoes/clown_shoes)
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
/mob/living/simple_animal/hostile/retaliate/kangaroo
|
||||
name = "Kangaroo"
|
||||
real_name = "Kangaroo"
|
||||
voice_name = "unidentifiable voice"
|
||||
desc = "A large marsupial herbivore. It has powerful hind legs, with nails that resemble long claws."
|
||||
icon_state = "kangaroo" // Credit: FoS
|
||||
icon_living = "kangaroo"
|
||||
icon_dead = "kangaroo_dead"
|
||||
icon_gib = "kangaroo_dead"
|
||||
turns_per_move = 8
|
||||
response_help = "pets"
|
||||
emote_hear = list("bark")
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
harm_intent_damage = 3
|
||||
melee_damage_lower = 5 // avg damage 12.5 without kick, (12.5+12.5+60)/3=25 with kick
|
||||
melee_damage_upper = 20
|
||||
attacktext = "slashes"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg' // they have nails that work like claws, so, slashing sound
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 2, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
move_to_delay = 4 // at 20ticks/sec, this is 5 tile/sec movespeed, about the same as a 'fast human'.
|
||||
speed = -1 // '-1' converts to 1.5 total move delay, or 6.6 tiles/sec movespeed
|
||||
var/attack_cycles = 0
|
||||
var/attack_cycles_max = 3
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/kangaroo/New()
|
||||
. = ..()
|
||||
// Leap spell, player-only usage
|
||||
AddSpell(new /obj/effect/proc_holder/spell/targeted/leap)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/kangaroo/AttackingTarget()
|
||||
if(client && a_intent != INTENT_HARM)
|
||||
return ..() // Do not allow player-controlled roos on non-attack intents to 'prime' their kick by nuzzling people.
|
||||
|
||||
var/mob/living/L = target
|
||||
if(!istype(L))
|
||||
return ..() // Do not do further checks if we somehow end up attacking something not alive (like a window).
|
||||
|
||||
if(L.stat == DEAD)
|
||||
return ..() // Do not allow player-controlled roos to prime their kick by attacking corpses.
|
||||
|
||||
attack_cycles++
|
||||
if(attack_cycles < attack_cycles_max)
|
||||
// Most of the time, do a standard attack...
|
||||
return ..()
|
||||
|
||||
// ... but, every attack_cycles_max attacks on a living mob, do a powerful disemboweling kick instead
|
||||
attack_cycles = 0
|
||||
attacktext = "VICIOUSLY KICKS"
|
||||
melee_damage_lower = 60
|
||||
melee_damage_upper = 60
|
||||
. = ..()
|
||||
|
||||
var/rookick_dir = get_dir(src, L)
|
||||
var/turf/general_direction = get_edge_target_turf(L, rookick_dir)
|
||||
L.visible_message("<span class='danger'>[L] is kicked hard!</span>", "<span class='userdanger'>The kangaroo kick sends you flying mate!</span>")
|
||||
L.throw_at(general_direction, 10, 2)
|
||||
|
||||
attacktext = initial(attacktext)
|
||||
melee_damage_lower = initial(melee_damage_lower)
|
||||
melee_damage_upper = initial(melee_damage_upper)
|
||||
|
||||
@@ -42,7 +42,9 @@
|
||||
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING
|
||||
sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS
|
||||
anchored = 1
|
||||
move_force = MOVE_FORCE_EXTREMELY_STRONG
|
||||
move_resist = MOVE_FORCE_EXTREMELY_STRONG
|
||||
pull_force = MOVE_FORCE_EXTREMELY_STRONG
|
||||
status_flags = GODMODE // Cannot push also
|
||||
|
||||
var/cannot_be_seen = 1
|
||||
@@ -187,6 +189,13 @@
|
||||
L.EyeBlind(4)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/statue/update_sight()
|
||||
if(!client)
|
||||
return
|
||||
if(stat == DEAD)
|
||||
grant_death_vision()
|
||||
return
|
||||
|
||||
//Toggle Night Vision
|
||||
/obj/effect/proc_holder/spell/targeted/night_vision
|
||||
name = "Toggle Nightvision"
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
var/area/syndicate_depot/core/depotarea
|
||||
var/raised_alert = FALSE
|
||||
var/alert_on_death = FALSE
|
||||
var/alert_on_timeout = FALSE
|
||||
var/alert_on_timeout = TRUE
|
||||
var/alert_on_spacing = TRUE
|
||||
var/alert_on_shield_breach = FALSE
|
||||
var/seen_enemy = FALSE
|
||||
@@ -99,6 +99,7 @@
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/New()
|
||||
..()
|
||||
name = "[name] [pick(GLOB.last_names)]"
|
||||
// Do not attempt to move this code to Initialize() or LateInitialize(). Doing so with other objects has caused bugs in the past, because assigning "depotarea" may not work there.
|
||||
depotarea = areaMaster
|
||||
spawn_turf = get_turf(src)
|
||||
|
||||
@@ -197,7 +198,6 @@
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer
|
||||
name = "Syndicate Officer"
|
||||
alert_on_death = TRUE
|
||||
alert_on_timeout = TRUE
|
||||
melee_block_chance = 60
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory
|
||||
@@ -209,7 +209,6 @@
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
melee_block_chance = 80
|
||||
alert_on_timeout = TRUE
|
||||
alert_on_shield_breach = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Initialize()
|
||||
|
||||
@@ -561,17 +561,16 @@
|
||||
/mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/update_sight(reset_sight = FALSE)
|
||||
/mob/living/simple_animal/update_sight()
|
||||
if(!client)
|
||||
return
|
||||
if(stat == DEAD)
|
||||
grant_death_vision()
|
||||
return
|
||||
|
||||
if(reset_sight)
|
||||
see_invisible = initial(see_invisible)
|
||||
see_in_dark = initial(see_in_dark)
|
||||
sight = initial(sight)
|
||||
see_invisible = initial(see_invisible)
|
||||
see_in_dark = initial(see_in_dark)
|
||||
sight = initial(sight)
|
||||
|
||||
if(client.eye != src)
|
||||
var/atom/A = client.eye
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
var/mob_type = /mob/living/simple_animal/hostile/carp
|
||||
var/spawn_text = "emerges from"
|
||||
status_flags = 0
|
||||
anchored = 1
|
||||
move_resist = MOVE_FORCE_VERY_STRONG
|
||||
AIStatus = AI_OFF
|
||||
a_intent = INTENT_HARM
|
||||
stop_automated_movement = 1
|
||||
|
||||
@@ -64,4 +64,10 @@
|
||||
for(var/s in sharedSoullinks)
|
||||
var/datum/soullink/S = s
|
||||
S.sharerRevives(src)
|
||||
|
||||
if(mind)
|
||||
for(var/S in mind.spell_list)
|
||||
var/obj/effect/proc_holder/spell/spell = S
|
||||
spell.updateButtonIcon()
|
||||
|
||||
return 1
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user