mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-15 09:03:23 +01:00
Merge branch 'master' into darkmode-sql
This commit is contained in:
@@ -137,7 +137,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
|
||||
message_admins("[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.",1)
|
||||
|
||||
if(announceinirc)
|
||||
send2irc("BAN ALERT","[a_ckey] applied a [bantype_str] on [ckey]")
|
||||
send2discord("message", config.discord_channel_admin,"BAN ALERT","[a_ckey] applied a [bantype_str] on [ckey]")
|
||||
|
||||
if(kickbannedckey)
|
||||
if(banned_mob && banned_mob.client && banned_mob.client.ckey == banckey)
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
var/list/admin_verbs_default = list(
|
||||
/client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/
|
||||
/client/proc/hide_verbs, /*hides all our adminverbs*/
|
||||
/client/proc/toggleadminhelpsound, /*toggles whether we hear bwoinks*/
|
||||
/client/proc/toggleadminhelpsound,
|
||||
/client/proc/togglementorhelpsound,
|
||||
/client/proc/cmd_mentor_check_new_players,
|
||||
/client/proc/cmd_mentor_check_player_exp /* shows players by playtime */
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -108,7 +108,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
if("Mentorhelp")
|
||||
msg = "<span class='mentorhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, TRUE, selected_type)] ([ADMIN_QUE(mob,"?")]) ([ADMIN_PP(mob,"PP")]) ([ADMIN_VV(mob,"VV")]) ([ADMIN_SM(mob,"SM")]) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[UID()]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[mob.UID()]'>CL</A>)" : ""] (<A HREF='?_src_=holder;take_question=[mob.UID()];is_mhelp=1'>TAKE</A>) :</span> <span class='mentorhelp'>[msg]</span>"
|
||||
for(var/client/X in mentorholders + modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
if(X.prefs.sound & SOUND_MENTORHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
to_chat(X, msg)
|
||||
if("Adminhelp")
|
||||
@@ -136,15 +136,15 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
log_admin("[selected_type]: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.")
|
||||
if(admin_number_present <= 0)
|
||||
if(!admin_number_afk)
|
||||
send2adminirc("[selected_type] from [key_name(src)]: [original_msg] - !!No admins online!!")
|
||||
send2admindiscord("[selected_type] from [key_name(src)]: [original_msg] - !!No admins online!!")
|
||||
else
|
||||
send2adminirc("[selected_type] from [key_name(src)]: [original_msg] - !!All admins AFK ([admin_number_afk])!!")
|
||||
send2admindiscord("[selected_type] from [key_name(src)]: [original_msg] - !!All admins AFK ([admin_number_afk])!!")
|
||||
else
|
||||
send2adminirc("[selected_type] from [key_name(src)]: [original_msg]")
|
||||
send2admindiscord("[selected_type] from [key_name(src)]: [original_msg]")
|
||||
feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
return
|
||||
|
||||
/proc/send2irc_adminless_only(source, msg, requiredflags = R_BAN)
|
||||
/proc/send2discord_adminless_only(source, msg, requiredflags = R_BAN)
|
||||
var/admin_number_total = 0 //Total number of admins
|
||||
var/admin_number_afk = 0 //Holds the number of admins who are afk
|
||||
var/admin_number_ignored = 0 //Holds the number of admins without +BAN (so admins who are not really admins)
|
||||
@@ -166,7 +166,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
var/admin_number_present = admin_number_total - admin_number_decrease //Number of admins who are neither afk nor invalid
|
||||
if(admin_number_present <= 0)
|
||||
if(!admin_number_afk && !admin_number_ignored)
|
||||
send2irc(source, "[msg] - No admins online")
|
||||
send2discord("message", source, "[msg] - No admins online")
|
||||
else
|
||||
send2irc(source, "[msg] - All admins AFK ([admin_number_afk]/[admin_number_total]) or skipped ([admin_number_ignored]/[admin_number_total])")
|
||||
send2discord("message", source, "[msg] - All admins AFK ([admin_number_afk]/[admin_number_total]) or skipped ([admin_number_ignored]/[admin_number_total])")
|
||||
return admin_number_present
|
||||
|
||||
@@ -71,6 +71,9 @@
|
||||
var/turf/T = locate(tx, ty, tz)
|
||||
if(T)
|
||||
admin_forcemove(usr, T)
|
||||
if(isobserver(usr))
|
||||
var/mob/dead/observer/O = usr
|
||||
O.ManualFollow(T)
|
||||
feedback_add_details("admin_verb","JC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
if(!isobserver(usr))
|
||||
message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]")
|
||||
|
||||
@@ -218,7 +218,7 @@
|
||||
to_chat(src, "<span class='notice'>[msg]</span>")
|
||||
return
|
||||
|
||||
send2adminirc("PlayerPM from [key_name(src)]: [html_decode(msg)]")
|
||||
send2admindiscord("PlayerPM from [key_name(src)]: [html_decode(msg)]")
|
||||
|
||||
to_chat(src, "<font color='blue'>IRC PM to-<b>IRC-Admins</b>: [msg]</font>")
|
||||
|
||||
|
||||
@@ -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!
|
||||
|
||||
|
||||
@@ -119,6 +119,7 @@ var/global/sent_honksquad = 0
|
||||
equip_to_slot_or_del(new /obj/item/stamp/clown(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/toy/crayon/rainbow(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/reagent_containers/spray/waterflower(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/reagent_containers/food/pill/patch/jestosterone(src), slot_r_store)
|
||||
if(prob(50))
|
||||
equip_to_slot_or_del(new /obj/item/gun/energy/clown(src), slot_in_backpack)
|
||||
else
|
||||
|
||||
@@ -152,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
|
||||
|
||||
@@ -85,14 +85,13 @@ var/global/sent_syndicate_strike_team = 0
|
||||
|
||||
to_chat(new_syndicate_commando, "<span class='notice'>You are an Elite Syndicate [is_leader ? "<B>TEAM LEADER</B>" : "commando"] in the service of the Syndicate. \nYour current mission is: <span class='userdanger'>[input]</span></span>")
|
||||
new_syndicate_commando.faction += "syndicate"
|
||||
var/datum/atom_hud/antag/opshud = huds[ANTAG_HUD_OPS]
|
||||
opshud.join_hud(new_syndicate_commando.mind.current)
|
||||
set_antag_hud(new_syndicate_commando.mind.current, "hudoperative")
|
||||
new_syndicate_commando.regenerate_icons()
|
||||
is_leader = FALSE
|
||||
syndicate_commando_number--
|
||||
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
if(L.name == "Syndicate-Commando-Bomb")
|
||||
new /obj/effect/spawner/newbomb/timer/syndicate(L.loc)
|
||||
qdel(L)
|
||||
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] has spawned a Syndicate strike squad.</span>", 1)
|
||||
log_admin("[key_name(usr)] used Spawn Syndicate Squad.")
|
||||
feedback_add_details("admin_verb","SDTHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -122,49 +121,46 @@ var/global/sent_syndicate_strike_team = 0
|
||||
qdel(spawn_location)
|
||||
return new_syndicate_commando
|
||||
|
||||
/mob/living/carbon/human/proc/equip_syndicate_commando(is_leader = FALSE)
|
||||
|
||||
/mob/living/carbon/human/proc/equip_syndicate_commando(is_leader = FALSE, full_gear = FALSE)
|
||||
var/obj/item/radio/R = new /obj/item/radio/headset/syndicate/alt/syndteam(src)
|
||||
R.set_frequency(SYNDTEAM_FREQ)
|
||||
equip_to_slot_or_del(R, slot_l_ear)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(src), slot_w_uniform)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_shoes)
|
||||
if(is_leader)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red/strike(src), slot_wear_suit)
|
||||
else
|
||||
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/strike(src), slot_wear_suit)
|
||||
if(!full_gear)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(src), slot_gloves)
|
||||
if(is_leader)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/red/strike(src), slot_head)
|
||||
else
|
||||
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/strike(src), slot_head)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/storage/backpack/security(src), slot_back)
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/mm556x45)
|
||||
equip_to_slot_or_del(new /obj/item/storage/box/survival_syndi(src), slot_in_backpack)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m45(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/gun/projectile/revolver(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/a357(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/flashlight(src), slot_in_backpack)
|
||||
if(is_leader)
|
||||
equip_to_slot_or_del(new /obj/item/pinpointer(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/disk/nuclear(src), slot_in_backpack)
|
||||
else
|
||||
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/card/emag(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/melee/energy/sword/saber(src), slot_l_store)
|
||||
equip_to_slot_or_del(new /obj/item/grenade/empgrenade(src), slot_r_store)
|
||||
equip_to_slot_or_del(new /obj/item/tank/emergency_oxygen/double/full(src), slot_s_store)
|
||||
equip_to_slot_or_del(new /obj/item/gun/projectile/automatic/pistol/m1911(src), slot_belt)
|
||||
equip_to_slot_or_del(new /obj/item/card/emag(src), slot_r_store)
|
||||
equip_to_slot_or_del(new /obj/item/melee/energy/sword/saber/red(src), slot_l_store)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/gun/projectile/automatic/l6_saw(src), slot_r_hand)
|
||||
if(full_gear)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/sst(src), slot_head)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite/sst(src), slot_wear_suit)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
|
||||
equip_to_slot_or_del(new /obj/item/storage/belt/military/sst(src), slot_belt)
|
||||
equip_to_slot_or_del(new /obj/item/tank/jetpack/oxygen/harness(src), slot_s_store)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/gun/projectile/automatic/l6_saw(src), slot_r_hand)
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/mm556x45(src), slot_in_backpack)
|
||||
|
||||
var/obj/item/implant/dust/D = new /obj/item/implant/dust(src)
|
||||
D.implant(src)
|
||||
var/obj/item/card/id/syndicate/W = new(src) //Untrackable by AI
|
||||
W.name = "[real_name]'s ID Card"
|
||||
W.icon_state = "syndie"
|
||||
W.access = get_all_accesses()//They get full station access because obviously the syndicate has HAAAX, and can make special IDs for their most elite members.
|
||||
W.assignment = "Syndicate Commando"
|
||||
W.access += get_syndicate_access(W.assignment)
|
||||
W.registered_name = real_name
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
var/checking = FALSE
|
||||
var/TC_cost = 0
|
||||
var/borg_to_spawn
|
||||
var/list/possible_types = list("Assault", "Medical")
|
||||
var/list/possible_types = list("Assault", "Medical", "Saboteur")
|
||||
|
||||
/obj/item/antag_spawner/borg_tele/attack_self(mob/user)
|
||||
if(used)
|
||||
@@ -43,6 +43,7 @@
|
||||
var/mob/M = pick(borg_candidates)
|
||||
var/client/C = M.client
|
||||
spawn_antag(C, get_turf(src.loc), "syndieborg")
|
||||
qdel(src)
|
||||
else
|
||||
checking = FALSE
|
||||
to_chat(user, "<span class='notice'>Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.</span>")
|
||||
@@ -57,6 +58,8 @@
|
||||
switch(borg_to_spawn)
|
||||
if("Medical")
|
||||
R = new /mob/living/silicon/robot/syndicate/medical(T)
|
||||
if("Saboteur")
|
||||
R = new /mob/living/silicon/robot/syndicate/saboteur(T)
|
||||
else
|
||||
R = new /mob/living/silicon/robot/syndicate(T) //Assault borg by default
|
||||
R.key = C.key
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
|
||||
+745
-746
File diff suppressed because it is too large
Load Diff
@@ -23,6 +23,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
ROLE_NINJA = 21,
|
||||
ROLE_GSPIDER = 21,
|
||||
ROLE_ABDUCTOR = 30,
|
||||
ROLE_DEVIL = 14
|
||||
)
|
||||
|
||||
/proc/player_old_enough_antag(client/C, role)
|
||||
@@ -280,7 +281,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if(species == "Vox")
|
||||
dat += "<b>N2 Tank:</b> <a href='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]</a><br>"
|
||||
if(species == "Grey")
|
||||
dat += "<b>Voice:</b> <a href ='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Wingdings" : "Normal"]</a><BR>"
|
||||
dat += "<b>Wingdings:</b> Set in disabilities<br>"
|
||||
dat += "<b>Voice Translator:</b> <a href ='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Secondary Language:</b> <a href='?_src_=prefs;preference=language;task=input'>[language]</a><br>"
|
||||
if(S.autohiss_basic_map)
|
||||
dat += "<b>Auto-accent:</b> <a href='?_src_=prefs;preference=autohiss_mode;task=input'>[autohiss_mode == AUTOHISS_FULL ? "Full" : (autohiss_mode == AUTOHISS_BASIC ? "Basic" : "Off")]</a><br>"
|
||||
@@ -827,29 +829,32 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
return 1
|
||||
|
||||
/datum/preferences/proc/ShowDisabilityState(mob/user,flag,label)
|
||||
/datum/preferences/proc/ShowDisabilityState(mob/user, flag, label)
|
||||
var/datum/species/S = GLOB.all_species[species]
|
||||
if(flag==DISABILITY_FLAG_FAT && !(CAN_BE_FAT in S.species_traits))
|
||||
if(flag == DISABILITY_FLAG_FAT && !(CAN_BE_FAT in S.species_traits))
|
||||
return "<li><i>[species] cannot be fat.</i></li>"
|
||||
return "<li><b>[label]:</b> <a href=\"?_src_=prefs;task=input;preference=disabilities;disability=[flag]\">[disabilities & flag ? "Yes" : "No"]</a></li>"
|
||||
|
||||
/datum/preferences/proc/SetDisabilities(mob/user)
|
||||
var/datum/species/S = GLOB.all_species[species]
|
||||
var/HTML = "<body>"
|
||||
HTML += "<tt><center>"
|
||||
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs glasses")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_COLOURBLIND,"Colourblind")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_TOURETTES,"Tourettes syndrome") // this will / can not be abused. It also SEVERELY stuns. It's just for fun.
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_NERVOUS,"Stutter")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_SWEDISH,"Swedish accent")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_LISP,"Lisp")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_DIZZY,"Dizziness")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_SCRAMBLED,"Can't speak properly")
|
||||
if(CAN_WINGDINGS in S.species_traits)
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_WINGDINGS, "Speak in Wingdings")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_NEARSIGHTED, "Needs glasses")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_FAT, "Obese")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_EPILEPTIC, "Seizures")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_DEAF, "Deaf")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_BLIND, "Blind")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_COLOURBLIND, "Colourblind")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_MUTE, "Mute")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_TOURETTES, "Tourettes syndrome") // this will / can not be abused. It also SEVERELY stuns. It's just for fun.
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_NERVOUS, "Stutter")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_SWEDISH, "Swedish accent")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_LISP, "Lisp")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_DIZZY, "Dizziness")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_SCRAMBLED, "Can't speak properly")
|
||||
|
||||
|
||||
HTML += {"</ul>
|
||||
@@ -857,7 +862,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
<a href=\"?_src_=prefs;task=reset;preference=disabilities\">\[Reset\]</a>
|
||||
</center></tt>"}
|
||||
|
||||
var/datum/browser/popup = new(user, "disabil", "<div align='center'>Choose Disabilities</div>", 350, 300)
|
||||
var/datum/browser/popup = new(user, "disabil", "<div align='center'>Choose Disabilities</div>", 350, 380)
|
||||
popup.set_content(HTML)
|
||||
popup.open(0)
|
||||
|
||||
@@ -2191,47 +2196,65 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
character.change_eye_color(e_colour)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_FAT && (CAN_BE_FAT in character.dna.species.species_traits))
|
||||
character.dna.SetSEState(FATBLOCK,1,1)
|
||||
character.dna.SetSEState(FATBLOCK, TRUE, TRUE)
|
||||
character.overeatduration = 600
|
||||
character.dna.default_blocks.Add(FATBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_NEARSIGHTED)
|
||||
character.dna.SetSEState(GLASSESBLOCK,1,1)
|
||||
character.dna.SetSEState(GLASSESBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(GLASSESBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_EPILEPTIC)
|
||||
character.dna.SetSEState(EPILEPSYBLOCK,1,1)
|
||||
character.dna.SetSEState(EPILEPSYBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(EPILEPSYBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_DEAF)
|
||||
character.dna.SetSEState(DEAFBLOCK,1,1)
|
||||
character.dna.SetSEState(DEAFBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(DEAFBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_BLIND)
|
||||
character.dna.SetSEState(BLINDBLOCK,1,1)
|
||||
character.dna.SetSEState(BLINDBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(BLINDBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_COLOURBLIND)
|
||||
character.dna.SetSEState(COLOURBLINDBLOCK,1,1)
|
||||
character.dna.SetSEState(COLOURBLINDBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(COLOURBLINDBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_MUTE)
|
||||
character.dna.SetSEState(MUTEBLOCK,1,1)
|
||||
character.dna.SetSEState(MUTEBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(MUTEBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_TOURETTES)
|
||||
character.dna.SetSEState(TWITCHBLOCK,1,1)
|
||||
character.dna.SetSEState(TWITCHBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(TWITCHBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_NERVOUS)
|
||||
character.dna.SetSEState(NERVOUSBLOCK,1,1)
|
||||
character.dna.SetSEState(NERVOUSBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(NERVOUSBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_SWEDISH)
|
||||
character.dna.SetSEState(SWEDEBLOCK,1,1)
|
||||
character.dna.SetSEState(SWEDEBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(SWEDEBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_SCRAMBLED)
|
||||
character.dna.SetSEState(SCRAMBLEBLOCK,1,1)
|
||||
character.dna.SetSEState(SCRAMBLEBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(SCRAMBLEBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_LISP)
|
||||
character.dna.SetSEState(LISPBLOCK,1,1)
|
||||
character.dna.SetSEState(LISPBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(LISPBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_DIZZY)
|
||||
character.dna.SetSEState(DIZZYBLOCK,1,1)
|
||||
character.dna.SetSEState(DIZZYBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(DIZZYBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_SCRAMBLED)
|
||||
character.dna.SetSEState(SCRAMBLEBLOCK,1,1)
|
||||
character.dna.SetSEState(SCRAMBLEBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(SCRAMBLEBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_WINGDINGS && (CAN_WINGDINGS in character.dna.species.species_traits))
|
||||
character.dna.SetSEState(WINGDINGSBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(WINGDINGSBLOCK)
|
||||
|
||||
character.dna.species.handle_dna(character)
|
||||
|
||||
|
||||
@@ -46,6 +46,17 @@
|
||||
to_chat(usr, "You will [(prefs.sound & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.")
|
||||
feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/togglementorhelpsound()
|
||||
set name = "Hear/Silence Mentorhelp Bwoinks"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle hearing a notification when mentorhelps are recieved"
|
||||
if(!holder)
|
||||
return
|
||||
prefs.sound ^= SOUND_MENTORHELP
|
||||
prefs.save_preferences(src)
|
||||
to_chat(usr, "You will [(prefs.sound & SOUND_MENTORHELP) ? "now" : "no longer"] hear a sound when mentorhelps arrive.")
|
||||
feedback_add_details("admin_verb","MHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/deadchat() // Deadchat toggle is usable by anyone.
|
||||
set name = "Show/Hide Deadchat"
|
||||
set category = "Preferences"
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -79,6 +79,7 @@ obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team
|
||||
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)
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
@@ -339,7 +339,7 @@
|
||||
linkedsuit = loc
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user)
|
||||
|
||||
|
||||
if(!linkedsuit)
|
||||
to_chat(user, "<span class='notice'>You must attach the helmet to a syndicate hardsuit to toggle combat mode!</span>")
|
||||
return
|
||||
@@ -462,6 +462,16 @@
|
||||
name = "elite syndicate hardsuit (combat)"
|
||||
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
|
||||
|
||||
//Strike team hardsuits
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/sst
|
||||
armor = list(melee = 70, bullet = 70, laser = 50, energy = 40, bomb = 80, bio = 100, rad = 100) //Almost as good as DS gear, but unlike DS can switch to combat for mobility
|
||||
icon_state = "hardsuit0-sst"
|
||||
item_color = "sst"
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/syndi/elite/sst
|
||||
armor = list(melee = 70, bullet = 70, laser = 50, energy = 40, bomb = 80, bio = 100, rad = 100)
|
||||
icon_state = "hardsuit0-sst"
|
||||
item_color = "sst"
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/syndi/freedom
|
||||
name = "eagle suit"
|
||||
@@ -479,15 +489,15 @@
|
||||
icon_state = "hardsuit0-wiz"
|
||||
item_state = "wiz_helm"
|
||||
item_color = "wiz"
|
||||
unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles!
|
||||
unacidable = TRUE //No longer shall our kind be foiled by lone chemists with spray bottles!
|
||||
armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
|
||||
heat_protection = HEAD //Uncomment to enable firesuit protection
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/helmet.dmi'
|
||||
)
|
||||
magical = TRUE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/wizard
|
||||
icon_state = "hardsuit-wiz"
|
||||
@@ -495,13 +505,13 @@
|
||||
desc = "A bizarre gem-encrusted suit that radiates magical energies."
|
||||
item_state = "wiz_hardsuit"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
unacidable = 1
|
||||
unacidable = TRUE
|
||||
armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
|
||||
allowed = list(/obj/item/teleportation_scroll,/obj/item/tank)
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
sprite_sheets = null
|
||||
magical = TRUE
|
||||
|
||||
//Medical hardsuit
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/medical
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
var/time = 30 //time in deciseconds
|
||||
var/parts[] = list() //type paths of items that will be placed in the result
|
||||
var/chem_catalysts[] = list() //like tools but for reagents
|
||||
var/category = CAT_MISC // Recipe category
|
||||
var/category = CAT_NONE // Recipe category
|
||||
var/roundstart_enabled = TRUE //Set to FALSE if you don't want a particular crafting recipe to be available all the time
|
||||
|
||||
/datum/crafting_recipe/proc/AdjustChems(var/obj/resultobj as obj)
|
||||
//This proc is to replace the make_food proc of recipes from microwaves and such that are being converted to table crafting recipes.
|
||||
@@ -89,6 +90,17 @@
|
||||
time = 40
|
||||
category = CAT_ROBOT
|
||||
|
||||
/datum/crafting_recipe/honkbot
|
||||
name = "Honkbot"
|
||||
result = /mob/living/simple_animal/bot/honkbot
|
||||
reqs = list(/obj/item/robot_parts/r_arm = 1,
|
||||
/obj/item/bikehorn = 1,
|
||||
/obj/item/assembly/prox_sensor = 1,
|
||||
/obj/item/storage/box/clown = 1,
|
||||
/obj/item/instrument/trombone = 1)
|
||||
time = 40
|
||||
category = CAT_ROBOT
|
||||
|
||||
/datum/crafting_recipe/floorbot
|
||||
name = "Floorbot"
|
||||
result = /mob/living/simple_animal/bot/floorbot
|
||||
@@ -239,6 +251,7 @@
|
||||
reqs = list(/obj/item/camera = 1,
|
||||
/datum/reagent/holywater = 10)
|
||||
parts = list(/obj/item/camera = 1)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/papersack
|
||||
name = "Paper Sack"
|
||||
@@ -261,6 +274,7 @@
|
||||
time = 50
|
||||
reqs = list(/obj/item/stack/tape_roll = 1,
|
||||
/datum/reagent/liquidgibs = 10)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/garrote
|
||||
name = "Makeshift Garrote"
|
||||
@@ -297,6 +311,7 @@
|
||||
time = 15
|
||||
reqs = list(/obj/item/clothing/gloves/color/latex = 1,
|
||||
/obj/item/stack/cable_coil = 5)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/gold_horn
|
||||
name = "Golden bike horn"
|
||||
@@ -406,4 +421,14 @@
|
||||
/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
|
||||
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
|
||||
|
||||
@@ -900,6 +900,13 @@
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
icon_state = "dusty_jacket"
|
||||
|
||||
/obj/item/clothing/suit/fluff/cheeky_sov_coat //CheekyCrenando: Srusu Rskuzu
|
||||
name = "Srusu's Greatcoat"
|
||||
desc = "A heavy wool Soviet-style greatcoat. A name is written in fancy handwriting on the inside tag: Srusu Rskuzu"
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
item_state = "cheeky_sov_coat"
|
||||
icon_state = "cheeky_sov_coat"
|
||||
|
||||
/obj/item/clothing/suit/fluff/supplymaster_jacket //Denthamos: Henry Grandpa Gadow
|
||||
name = "faded NT Supply Master's Coat"
|
||||
desc = "A faded leather overcoat bearing a worn out badge from the NAS Crescent on the shoulder, and a designation tag of Supply Master on the front. A tarnished gold nameplate says H.Gadow on it."
|
||||
@@ -984,6 +991,14 @@
|
||||
species_fit = null
|
||||
sprite_sheets = null
|
||||
|
||||
/obj/item/clothing/suit/storage/labcoat/fluff/ionward_labcoat // Ionward: Gemini
|
||||
name = "Technocracy labcoat"
|
||||
desc = "A thin, faded, carbon fiber labcoat. On the back, a Technocracy vessel's logo. Inside, the name 'Gemini' is printed on the collar."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "ionward_labcoat_open"
|
||||
species_fit = null
|
||||
sprite_sheets = null
|
||||
|
||||
/obj/item/clothing/suit/fluff/stobarico_greatcoat // Stobarico: F.U.R.R.Y
|
||||
name = "\improper F.U.R.R.Y's Nanotrasen Greatcoat"
|
||||
desc = "A greatcoat with Nanotrasen colors."
|
||||
@@ -1597,3 +1612,18 @@
|
||||
item_color = "Xann_necklace"
|
||||
slot_flags = SLOT_TIE
|
||||
|
||||
/obj/item/instrument/accordion/fluff/asmer_accordion //Asmerath: Coloratura
|
||||
name = "Rara's Somber Accordion"
|
||||
desc = "A blue colored accordion with claw indentations on the keys made special for vulpkanins."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "asmer_accordion"
|
||||
item_state = "asmer_accordion"
|
||||
|
||||
|
||||
/obj/item/clothing/head/rabbitears/fluff/pinesalad_bunny // Pineapple Salad : Dan Jello
|
||||
name = "Bluespace rabbit ears"
|
||||
desc = "A pair of sparkly bluespace rabbit ears, with a small tag on them that reads, 'Dan Jello~'. Yuck, \
|
||||
there's some pink slime on the part that goes on your head!"
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "ps_bunny"
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
can_be_placed_into = null
|
||||
flags = NOBLUDGEON
|
||||
container_type = OPENCONTAINER
|
||||
has_lid = FALSE
|
||||
var/wipespeed = 30
|
||||
|
||||
/obj/item/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag)
|
||||
|
||||
@@ -194,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/tear
|
||||
/datum/event/tear/honk
|
||||
var/obj/effect/tear/honk/HE //i could just inherit but its being finicky.
|
||||
|
||||
/datum/event/tear/honk/announce()
|
||||
@@ -9,7 +9,7 @@
|
||||
if(T)
|
||||
HE = new /obj/effect/tear/honk(T.loc)
|
||||
|
||||
/datum/event/tear/end()
|
||||
/datum/event/tear/honk/end()
|
||||
if(HE)
|
||||
qdel(HE)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
/proc/send2discord(command, channel, message)
|
||||
if (config.use_discord_bot && config.discord_host)
|
||||
world.Export("http://[config.discord_host]/?command=[command]&channel=[channel]&message=[paranoid_sanitize(message)]")
|
||||
|
||||
/proc/send2maindiscord(message)
|
||||
if(config.discord_channel_main)
|
||||
send2discord("message", config.discord_channel_main, message)
|
||||
return
|
||||
|
||||
/proc/send2admindiscord(message)
|
||||
if(config.discord_channel_admin)
|
||||
send2discord("message", config.discord_channel_admin, message)
|
||||
return
|
||||
|
||||
/hook/startup/proc/discordNotify()
|
||||
if(config.discord_channel_main)
|
||||
send2discord("startup", config.discord_channel_main, "Server starting up on [station_name()]. Connect to: [config.server? "[config.server]" : "[world.address]:[world.port]"]")
|
||||
return 1
|
||||
@@ -1,21 +0,0 @@
|
||||
/proc/send2irc(var/channel, var/msg)
|
||||
if(config.use_irc_bot && config.irc_bot_host.len)
|
||||
for(var/IP in config.irc_bot_host)
|
||||
spawn(0)
|
||||
// I have no means of trusting you, cmd
|
||||
ext_python("ircbot_message.py", "[config.comms_password] [IP] [channel] [paranoid_sanitize(msg)]")
|
||||
return
|
||||
|
||||
/proc/send2mainirc(var/msg)
|
||||
if(config.main_irc)
|
||||
send2irc(config.main_irc, msg)
|
||||
return
|
||||
|
||||
/proc/send2adminirc(var/msg)
|
||||
if(config.admin_irc)
|
||||
send2irc(config.admin_irc, msg)
|
||||
return
|
||||
|
||||
/hook/startup/proc/ircNotify()
|
||||
send2mainirc("Server starting up on [station_name()]. Connect to: [config.server? "[config.server]" : "[world.address]:[world.port]"]")
|
||||
return 1
|
||||
@@ -817,9 +817,9 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
|
||||
playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0)
|
||||
if(9)
|
||||
//To make it more realistic, I added two gunshots (enough to kill)
|
||||
playsound_local(null, 'sound/weapons/Gunshot.ogg', 25, 1)
|
||||
playsound_local(null, 'sound/weapons/gunshots/gunshot.ogg', 25, 1)
|
||||
var/timer_pause = rand(10,30)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound_local, null, 'sound/weapons/Gunshot.ogg', 25, 1), timer_pause)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound_local, null, 'sound/weapons/gunshots/gunshot.ogg', 25, 1), timer_pause)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound_local, null, sound(get_sfx("bodyfall"), 25), 25, 1), timer_pause+rand(5,10))
|
||||
if(10)
|
||||
playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50)
|
||||
|
||||
@@ -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)
|
||||
@@ -345,7 +345,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/donut/sprinkles
|
||||
name = "frosted donut"
|
||||
icon_state = "donut2"
|
||||
list_reagents = list("nutriment" = 3, "sugar" = 2, "spinkles" = 2)
|
||||
list_reagents = list("nutriment" = 3, "sugar" = 2, "sprinkles" = 2)
|
||||
filling_color = "#FF69B4"
|
||||
randomized_sprinkles = 0
|
||||
|
||||
|
||||
@@ -252,4 +252,23 @@
|
||||
)
|
||||
tools = list(/obj/item/kitchen/sushimat)
|
||||
result = /obj/item/reagent_containers/food/snacks/sliceable/Tai_maki
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/crafting_recipe/food
|
||||
|
||||
/datum/crafting_recipe/food/New()
|
||||
parts |= reqs
|
||||
|
||||
/datum/crafting_recipe/food/cak
|
||||
name = "Living cat/cake hybrid"
|
||||
reqs = list(
|
||||
/obj/item/organ/internal/brain = 1,
|
||||
/obj/item/organ/internal/heart = 1,
|
||||
/obj/item/reagent_containers/food/snacks/sliceable/birthdaycake = 1,
|
||||
/obj/item/reagent_containers/food/snacks/meat = 3,
|
||||
/datum/reagent/blood = 30,
|
||||
/datum/reagent/consumable/sprinkles = 5,
|
||||
/datum/reagent/teslium = 1,
|
||||
)
|
||||
result = /mob/living/simple_animal/pet/cat/cak
|
||||
category = CAT_FOOD
|
||||
@@ -219,6 +219,8 @@
|
||||
var/mob/M = usr
|
||||
if(M.incapacitated() || !Adjacent(M))
|
||||
return
|
||||
if(!ishuman(M))
|
||||
return
|
||||
|
||||
if(over_object == M || istype(over_object, /obj/screen))
|
||||
if(!remove_item_from_storage(M))
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
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]"]
|
||||
|
||||
@@ -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")
|
||||
@@ -167,8 +167,9 @@
|
||||
icon_state ="book"
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
force = 2
|
||||
w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
|
||||
attack_verb = list("bashed", "whacked", "educated")
|
||||
attack_verb = list("bashed", "whacked")
|
||||
burn_state = FLAMMABLE
|
||||
|
||||
var/dat // Actual page content
|
||||
@@ -283,6 +284,14 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/book/attack(mob/M, mob/living/user)
|
||||
if(user.a_intent == INTENT_HELP)
|
||||
force = 0
|
||||
attack_verb = list("educated")
|
||||
else
|
||||
force = initial(force)
|
||||
attack_verb = list("bashed", "whacked")
|
||||
..()
|
||||
|
||||
/*
|
||||
* Barcode Scanner
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
ranged_message = "shoots"
|
||||
ranged_cooldown_time = 30
|
||||
projectiletype = /obj/item/projectile/kinetic
|
||||
projectilesound = 'sound/weapons/Gunshot4.ogg'
|
||||
projectilesound = 'sound/weapons/gunshots/gunshot4.ogg'
|
||||
speak_emote = list("states")
|
||||
wanted_objects = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver,
|
||||
/obj/item/stack/ore/plasma, /obj/item/stack/ore/uranium, /obj/item/stack/ore/iron,
|
||||
|
||||
@@ -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,6 +715,8 @@ 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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
sound_vol *= 0.5
|
||||
|
||||
if(sleeping || stat == UNCONSCIOUS)
|
||||
hear_sleep(message_pieces)
|
||||
hear_sleep(multilingual_to_message(message_pieces))
|
||||
return 0
|
||||
|
||||
var/speaker_name = speaker.name
|
||||
@@ -97,7 +97,7 @@
|
||||
|
||||
if(!can_hear())
|
||||
// INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set
|
||||
// if(!language || !(language.flags & INNATE))
|
||||
// if(!language || !(language.flags & INNATE))
|
||||
if(speaker == src)
|
||||
to_chat(src, "<span class='warning'>You cannot hear yourself speak!</span>")
|
||||
else
|
||||
@@ -158,14 +158,16 @@
|
||||
message = strip_html_properly(message)
|
||||
var/list/punctuation = list(",", "!", ".", ";", "?")
|
||||
var/list/messages = splittext(message, " ")
|
||||
var/R = rand(1, messages.len)
|
||||
var/heardword = messages[R]
|
||||
if(copytext(heardword,1, 1) in punctuation)
|
||||
heardword = copytext(heardword,2)
|
||||
if(copytext(heardword,-1) in punctuation)
|
||||
heardword = copytext(heardword,1,lentext(heardword))
|
||||
heard = "<span class='game say'>...<i>You hear something about<i>... '[heardword]'...</span>"
|
||||
|
||||
if(messages.len > 0)
|
||||
var/R = rand(1, messages.len)
|
||||
var/heardword = messages[R]
|
||||
if(copytext(heardword,1, 1) in punctuation)
|
||||
heardword = copytext(heardword,2)
|
||||
if(copytext(heardword,-1) in punctuation)
|
||||
heardword = copytext(heardword,1,lentext(heardword))
|
||||
heard = "<span class='game say'>...<i>You hear something about<i>... '[heardword]'...</span>"
|
||||
else
|
||||
heard = "<span class='game say'>...<i>You almost hear something...</i>...</span>"
|
||||
else
|
||||
heard = "<span class='game say'>...<i>You almost hear someone talking</i>...</span>"
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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,7 +92,7 @@
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/human/death(gibbed)
|
||||
if(can_die() && !gibbed)
|
||||
if(can_die() && !gibbed && deathgasp_on_death)
|
||||
emote("deathgasp") //let the world KNOW WE ARE DEAD
|
||||
|
||||
// Only execute the below if we successfully died
|
||||
@@ -176,3 +180,12 @@
|
||||
ChangeToHusk()
|
||||
mutations |= NOCLONE
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/cure_husk()
|
||||
mutations.Remove(HUSK)
|
||||
var/obj/item/organ/external/head/H = bodyparts_by_name["head"]
|
||||
if(istype(H))
|
||||
H.disfigured = FALSE
|
||||
update_body(0)
|
||||
update_mutantrace(0)
|
||||
UpdateAppearance() // reset hair from DNA
|
||||
|
||||
@@ -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,22 @@
|
||||
|
||||
/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))
|
||||
|| istype(get_item_by_slot(slot_wear_mask), /obj/item/clothing/mask/gas/voice/clown) \
|
||||
|| GetComponent(/datum/component/jestosterone))
|
||||
span = "sans"
|
||||
|
||||
|
||||
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
|
||||
@@ -381,7 +381,6 @@
|
||||
playsound(target.loc, attack.attack_sound, 25, 1, -1)
|
||||
|
||||
target.visible_message("<span class='danger'>[user] [pick(attack.attack_verb)]ed [target]!</span>")
|
||||
|
||||
target.apply_damage(damage, BRUTE, affecting, armor_block, sharp = attack.sharp) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway.
|
||||
if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
|
||||
target.visible_message("<span class='danger'>[user] has weakened [target]!</span>", \
|
||||
@@ -390,6 +389,7 @@
|
||||
target.forcesay(GLOB.hit_appends)
|
||||
else if(target.lying)
|
||||
target.forcesay(GLOB.hit_appends)
|
||||
SEND_SIGNAL(target, COMSIG_PARENT_ATTACKBY)
|
||||
|
||||
/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
|
||||
if(target.check_block()) //cqc
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
"heart" = /obj/item/organ/internal/heart,
|
||||
"liver" = /obj/item/organ/internal/liver,
|
||||
"kidneys" = /obj/item/organ/internal/kidneys,
|
||||
"brain" = /obj/item/organ/internal/brain,
|
||||
"brain" = /obj/item/organ/internal/brain/abductor,
|
||||
"appendix" = /obj/item/organ/internal/appendix,
|
||||
"eyes" = /obj/item/organ/internal/eyes/abductor //3 darksight.
|
||||
)
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN)
|
||||
clothing_flags = HAS_SOCKS
|
||||
default_hair_colour = "#000000"
|
||||
has_gender = FALSE
|
||||
dietflags = 0 //Diona regenerate nutrition in light and water, no diet necessary
|
||||
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
|
||||
skinned_type = /obj/item/stack/sheet/wood
|
||||
@@ -110,4 +111,4 @@
|
||||
H.adjustFireLoss(-(light_amount/4))
|
||||
if(H.nutrition < NUTRITION_LEVEL_STARVING+50)
|
||||
H.take_overall_damage(10,0)
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
species_traits = list(LIPS, IS_WHITELISTED)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT
|
||||
bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS
|
||||
has_gender = FALSE
|
||||
dietflags = DIET_OMNI
|
||||
|
||||
cold_level_1 = -1 //Default 260 - Lower is better
|
||||
@@ -59,4 +60,4 @@
|
||||
"metabolic strainer" = /obj/item/organ/internal/liver/drask,
|
||||
"eyes" = /obj/item/organ/internal/eyes/drask, //5 darksight.
|
||||
"brain" = /obj/item/organ/internal/brain/drask
|
||||
)
|
||||
)
|
||||
|
||||
@@ -21,11 +21,11 @@
|
||||
|
||||
default_genes = list(REMOTE_TALK)
|
||||
|
||||
|
||||
species_traits = list(LIPS, IS_WHITELISTED, CAN_BE_FAT)
|
||||
species_traits = list(LIPS, IS_WHITELISTED, CAN_BE_FAT, CAN_WINGDINGS)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = HAS_BODY_MARKINGS
|
||||
dietflags = DIET_HERB
|
||||
has_gender = FALSE
|
||||
reagent_tag = PROCESS_ORG
|
||||
blood_color = "#A200FF"
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
..()
|
||||
H.dna.SetSEState(REMOTETALKBLOCK, !remove, 1)
|
||||
genemutcheck(H, REMOTETALKBLOCK, null, MUTCHK_FORCED)
|
||||
H.dna.default_blocks.Add(REMOTETALKBLOCK)
|
||||
|
||||
/datum/species/grey/water_act(mob/living/carbon/human/H, volume, temperature, source)
|
||||
..()
|
||||
@@ -40,12 +41,21 @@
|
||||
H.emote("scream")
|
||||
|
||||
/datum/species/grey/after_equip_job(datum/job/J, mob/living/carbon/human/H)
|
||||
var/speech_pref = H.client.prefs.speciesprefs
|
||||
if(speech_pref)
|
||||
H.mind.speech_span = "wingdings"
|
||||
var/translator_pref = H.client.prefs.speciesprefs
|
||||
if(translator_pref || ((ismindshielded(H) || J.is_command || J.supervisors == "the captain") && (WINGDINGS in H.mutations)))
|
||||
if(J.title == "Mime")
|
||||
return
|
||||
if(J.title == "Clown")
|
||||
var/obj/item/organ/internal/cyberimp/brain/speech_translator/clown/implant = new
|
||||
implant.insert(H)
|
||||
else
|
||||
var/obj/item/organ/internal/cyberimp/brain/speech_translator/implant = new
|
||||
implant.insert(H)
|
||||
if(!translator_pref)
|
||||
to_chat(H, "<span class='notice'>A speech translator implant has been installed due to your role on the station.</span>")
|
||||
|
||||
/datum/species/grey/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
|
||||
if(R.id == "sacid")
|
||||
H.reagents.del_reagent(R.id)
|
||||
return 0
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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. */
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -508,6 +508,7 @@
|
||||
var/turf/T = loc
|
||||
. = ..()
|
||||
if(.)
|
||||
SEND_SIGNAL(src, COMSIG_MOVABLE_MOVED)
|
||||
handle_footstep(loc)
|
||||
step_count++
|
||||
|
||||
@@ -882,7 +883,7 @@
|
||||
// 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.
|
||||
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)
|
||||
@@ -940,3 +941,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -190,7 +190,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
message_range = 1
|
||||
if(first_piece.speaking)
|
||||
message_range = first_piece.speaking.get_talkinto_msg_range(message)
|
||||
|
||||
|
||||
var/msg
|
||||
if(!first_piece.speaking || !(first_piece.speaking.flags & NO_TALK_MSG))
|
||||
msg = "<span class='notice'>[src] talks into [used_radios[1]]</span>"
|
||||
@@ -343,6 +343,8 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
to_chat(src, "<span class='danger'>You're muzzled and cannot speak!</span>")
|
||||
return
|
||||
|
||||
log_whisper(multilingual_to_message(message_pieces), src)
|
||||
|
||||
var/message_range = 1
|
||||
var/eavesdropping_range = 2
|
||||
var/watching_range = 5
|
||||
@@ -445,7 +447,6 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
for(var/mob/M in watching)
|
||||
M.show_message(rendered, 2)
|
||||
|
||||
log_whisper(multilingual_to_message(message_pieces), src)
|
||||
return 1
|
||||
|
||||
/mob/living/speech_bubble(var/bubble_state = "",var/bubble_loc = src, var/list/bubble_recipients = list())
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,36 +20,36 @@
|
||||
|
||||
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)
|
||||
if(!gibbed && deathgasp_on_death)
|
||||
emote("deathgasp")
|
||||
|
||||
if(module)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -408,6 +408,7 @@
|
||||
..()
|
||||
modules += new /obj/item/healthanalyzer/advanced(src)
|
||||
modules += new /obj/item/reagent_scanner/adv(src)
|
||||
modules += new /obj/item/bodyanalyzer/borg/syndicate(src)
|
||||
modules += new /obj/item/borg_defib(src)
|
||||
modules += new /obj/item/roller_holder(src)
|
||||
modules += new /obj/item/reagent_containers/borghypo/syndicate(src)
|
||||
@@ -432,6 +433,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
|
||||
@@ -13,7 +13,7 @@
|
||||
if(INTENT_HARM, INTENT_DISARM)
|
||||
M.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
|
||||
visible_message("<span class='danger'>[M] [response_harm] [src]!</span>")
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
playsound(loc, attacked_sound, 25, 1, -1)
|
||||
attack_threshold_check(harm_intent_damage)
|
||||
add_attack_logs(M, src, "Melee attacked with fists")
|
||||
updatehealth()
|
||||
|
||||
@@ -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("")
|
||||
@@ -480,3 +480,56 @@
|
||||
new /obj/item/robot_parts/l_arm(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You remove the robot arm from [src].</span>")
|
||||
build_step--
|
||||
|
||||
//Honkbot Assembly
|
||||
/obj/item/storage/box/clown/attackby(obj/item/W, mob/user, params)
|
||||
if(!istype(W, /obj/item/robot_parts/l_arm) && !istype(W, /obj/item/robot_parts/r_arm))
|
||||
return ..()
|
||||
|
||||
if(contents.len)
|
||||
to_chat(user, "<span class='warning'>You need to empty [src] out first!</span>")
|
||||
return
|
||||
|
||||
var/obj/item/honkbot_arm_assembly/A = new /obj/item/honkbot_arm_assembly
|
||||
qdel(W)
|
||||
user.put_in_hands(A)
|
||||
to_chat(user, "<span class='notice'>You add the robot arm to the honkbot.</span>")
|
||||
user.unEquip(src, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/honkbot_arm_assembly
|
||||
name = "incomplete honkbot assembly."
|
||||
desc = "A clown box with a robot arm permanently grafted to it."
|
||||
icon = 'icons/obj/aibots.dmi'
|
||||
icon_state = "honkbot_arm"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
req_one_access = list(access_clown, access_robotics, access_mime)
|
||||
var/build_step = 0
|
||||
var/created_name = "Honkbot" //To preserve the name if it's a unique medbot I guess
|
||||
|
||||
/obj/item/honkbot_arm_assembly/attackby(obj/item/W, mob/user, params)
|
||||
..()
|
||||
if(build_step == 0)
|
||||
if(istype(W, /obj/item/assembly/prox_sensor))
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
build_step++
|
||||
to_chat(user, "<span class='notice'>You add the proximity sensor to [src].</span>")
|
||||
icon_state = "honkbot_proxy"
|
||||
qdel(W)
|
||||
else if(build_step == 1)
|
||||
if(istype(W, /obj/item/bikehorn))
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
build_step++
|
||||
to_chat(user, "<span class='notice'>You add the bikehorn to [src]! Honk!</span>")
|
||||
desc = "A clown box with a robot arm and a bikehorn permanently grafted to it. It needs a trombone to be finished"
|
||||
qdel(W)
|
||||
else if(build_step == 2)
|
||||
if(istype(W, /obj/item/instrument/trombone))
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You add the trombone to [src]! Heeeenk! </span>")
|
||||
qdel(W)
|
||||
new /mob/living/simple_animal/bot/honkbot(get_turf(loc))
|
||||
qdel(src)
|
||||
@@ -36,7 +36,7 @@
|
||||
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
|
||||
@@ -387,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()
|
||||
|
||||
@@ -553,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)
|
||||
@@ -583,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()
|
||||
|
||||
@@ -0,0 +1,321 @@
|
||||
/mob/living/simple_animal/bot/honkbot
|
||||
name = "\improper honkbot"
|
||||
desc = "A little robot. It looks happy with its bike horn."
|
||||
icon = 'icons/obj/aibots.dmi'
|
||||
icon_state = "honkbot"
|
||||
density = FALSE
|
||||
anchored = FALSE
|
||||
health = 25
|
||||
maxHealth = 25
|
||||
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
|
||||
pass_flags = PASSMOB
|
||||
radio_channel = "Service" //Service
|
||||
bot_type = HONK_BOT
|
||||
bot_filter = RADIO_HONKBOT
|
||||
model = "Honkbot"
|
||||
bot_core_type = /obj/machinery/bot_core/honkbot
|
||||
window_id = "autohonk"
|
||||
window_name = "Honkomatic Bike Horn Unit v1.0.7"
|
||||
data_hud_type = DATA_HUD_SECURITY_BASIC // show jobs
|
||||
path_image_color = "#FF69B4"
|
||||
|
||||
var/honksound = 'sound/items/bikehorn.ogg' //customizable sound
|
||||
var/spam_flag = FALSE
|
||||
var/cooldowntime = 30
|
||||
var/cooldowntimehorn = 10
|
||||
var/mob/living/carbon/target
|
||||
var/oldtarget_name
|
||||
var/target_lastloc = FALSE //Loc of target when arrested.
|
||||
var/last_found = FALSE //There's a delay
|
||||
var/threatlevel = FALSE
|
||||
var/arrest_type = FALSE
|
||||
|
||||
/obj/machinery/bot_core/honkbot
|
||||
req_one_access = list(access_clown, access_robotics, access_mime)
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
auto_patrol = TRUE
|
||||
var/datum/job/clown/J = new/datum/job/clown
|
||||
access_card.access += J.get_access()
|
||||
prev_access = access_card.access
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/proc/spam_flag_false() //used for addtimer
|
||||
spam_flag = FALSE
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/proc/sensor_blink()
|
||||
icon_state = "honkbot-c"
|
||||
addtimer(CALLBACK(src, .proc/update_icon), 5, TIMER_OVERRIDE|TIMER_UNIQUE)
|
||||
|
||||
//honkbots react with sounds.
|
||||
/mob/living/simple_animal/bot/honkbot/proc/react_ping()
|
||||
playsound(src, 'sound/machines/ping.ogg', 50, TRUE, -1) //the first sound upon creation!
|
||||
spam_flag = TRUE
|
||||
sensor_blink()
|
||||
addtimer(CALLBACK(src, .proc/spam_flag_false), 18) // calibrates before starting the honk
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/proc/react_buzz()
|
||||
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE, -1)
|
||||
sensor_blink()
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/bot_reset()
|
||||
..()
|
||||
target = null
|
||||
oldtarget_name = null
|
||||
anchored = FALSE
|
||||
walk_to(src, 0)
|
||||
last_found = world.time
|
||||
spam_flag = FALSE
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/set_custom_texts()
|
||||
text_hack = "You overload [name]'s sound control system"
|
||||
text_dehack = "You reboot [name] and restore the sound control system."
|
||||
text_dehack_fail = "[name] refuses to accept your authority!"
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/get_controls(mob/user)
|
||||
var/dat
|
||||
dat += hack(user)
|
||||
dat += showpai(user)
|
||||
dat += text({"
|
||||
<TT><B>Honkomatic Bike Horn Unit v1.0.7 controls</B></TT><BR><BR>
|
||||
Status: []<BR>
|
||||
Behaviour controls are [locked ? "locked" : "unlocked"]<BR>
|
||||
Maintenance panel is [open ? "opened" : "closed"]<BR>"},
|
||||
|
||||
"<A href='?src=[UID()];power=1'>[on ? "On" : "Off"]</A>")
|
||||
|
||||
if(!locked || issilicon(user) || user.can_admin_interact())
|
||||
dat += "Auto Patrol <A href='?src=[UID()];operation=patrol'>[auto_patrol ? "On" : "Off"]</A><BR>"
|
||||
|
||||
return dat
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/proc/retaliate(mob/living/carbon/human/H)
|
||||
threatlevel = H.assess_threat(src)
|
||||
threatlevel += 6
|
||||
if(threatlevel >= 4)
|
||||
target = H
|
||||
mode = BOT_HUNT
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/attack_hand(mob/living/carbon/human/H)
|
||||
if(H.a_intent == INTENT_HARM)
|
||||
retaliate(H)
|
||||
addtimer(CALLBACK(src, .proc/react_buzz), 5)
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/emag_act(mob/user)
|
||||
..()
|
||||
if(emagged == 2)
|
||||
if(user)
|
||||
to_chat(user, "<span class='warning'>You short out [src]'s target assessment circuits. It gives out an evil laugh!!</span>")
|
||||
oldtarget_name = user.name
|
||||
audible_message("<span class='danger'>[src] gives out an evil laugh!</span>")
|
||||
playsound(src, 'sound/machines/honkbot_evil_laugh.ogg', 75, 1, -1) // evil laughter
|
||||
update_icon()
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/bullet_act(obj/item/projectile/Proj)
|
||||
if((istype(Proj,/obj/item/projectile/beam)) || (istype(Proj,/obj/item/projectile/bullet) && (Proj.damage_type == BURN))||(Proj.damage_type == BRUTE) && (!Proj.nodamage && Proj.damage < health && ishuman(Proj.firer)))
|
||||
retaliate(Proj.firer)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/UnarmedAttack(atom/A)
|
||||
if(!on)
|
||||
return
|
||||
if(iscarbon(A))
|
||||
var/mob/living/carbon/C = A
|
||||
if(emagged <= 1)
|
||||
honk_attack(A)
|
||||
else
|
||||
if(!C.stunned || arrest_type) //originaly was paralisysed in tg ported as stun
|
||||
stun_attack(A)
|
||||
..()
|
||||
else if(!spam_flag) //honking at the ground
|
||||
bike_horn(A)
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum)
|
||||
if(istype(AM, /obj/item))
|
||||
playsound(src, honksound, 50, TRUE, -1)
|
||||
var/obj/item/I = AM
|
||||
if(I.throwforce < src.health && I.thrownby && ishuman(I.thrownby))
|
||||
var/mob/living/carbon/human/H = I.thrownby
|
||||
retaliate(H)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/proc/bike_horn() //use bike_horn
|
||||
if(emagged <= 1)
|
||||
if(!spam_flag)
|
||||
playsound(src, honksound, 50, TRUE, -1)
|
||||
spam_flag = TRUE //prevent spam
|
||||
sensor_blink()
|
||||
addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntimehorn)
|
||||
else if(emagged == 2) //emagged honkbots will spam short and memorable sounds.
|
||||
if(!spam_flag)
|
||||
playsound(src, "honkbot_e", 50, 0)
|
||||
spam_flag = TRUE // prevent spam
|
||||
icon_state = "honkbot-e"
|
||||
addtimer(CALLBACK(src, .proc/update_icon), 30, TIMER_OVERRIDE|TIMER_UNIQUE)
|
||||
addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntimehorn)
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/proc/honk_attack(mob/living/carbon/C) // horn attack
|
||||
if(!spam_flag)
|
||||
playsound(loc, honksound, 50, TRUE, -1)
|
||||
spam_flag = TRUE // prevent spam
|
||||
sensor_blink()
|
||||
addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntimehorn)
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/proc/stun_attack(mob/living/carbon/C) // airhorn stun
|
||||
if(!spam_flag)
|
||||
playsound(src, 'sound/items/AirHorn.ogg', 100, TRUE, -1) //HEEEEEEEEEEEENK!!
|
||||
sensor_blink()
|
||||
if(!spam_flag)
|
||||
if(ishuman(C))
|
||||
C.stuttering = 20 //stammer
|
||||
C.MinimumDeafTicks(0, 5) //far less damage than the H.O.N.K.
|
||||
C.Jitter(50)
|
||||
C.Weaken(5)
|
||||
C.Stun(5) // Paralysis from tg ported as stun
|
||||
if(client) //prevent spam from players..
|
||||
spam_flag = TRUE
|
||||
if(emagged <= 1) //HONK once, then leave
|
||||
threatlevel -= 6
|
||||
target = oldtarget_name
|
||||
else // you really don't want to hit an emagged honkbot
|
||||
threatlevel = 6 // will never let you go
|
||||
addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntime)
|
||||
add_attack_logs(src, C, "honked by [src]")
|
||||
C.visible_message("<span class='danger'>[src] has honked [C]!</span>",\
|
||||
"<span class='userdanger'>[src] has honked you!</span>")
|
||||
else
|
||||
C.stuttering = 20
|
||||
C.Stun(10)
|
||||
addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntime)
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/handle_automated_action()
|
||||
if(!..())
|
||||
return
|
||||
switch(mode)
|
||||
if(BOT_IDLE) // idle
|
||||
walk_to(src, 0)
|
||||
look_for_perp()
|
||||
if(!mode && auto_patrol)
|
||||
mode = BOT_START_PATROL
|
||||
if(BOT_HUNT)
|
||||
// if can't reach perp for long enough, go idle
|
||||
if(frustration >= 5) //gives up easier than beepsky
|
||||
walk_to(src, 0)
|
||||
back_to_idle()
|
||||
return
|
||||
if(target) // make sure target exists
|
||||
if(Adjacent(target) && isturf(target.loc))
|
||||
if(threatlevel <= 4)
|
||||
honk_attack(target)
|
||||
else
|
||||
if(threatlevel >= 6)
|
||||
set waitfor = 0
|
||||
stun_attack(target)
|
||||
anchored = FALSE
|
||||
target_lastloc = target.loc
|
||||
return
|
||||
else // not next to perp
|
||||
var/turf/olddist = get_dist(src, target)
|
||||
walk_to(src, target, 1, 4)
|
||||
if((get_dist(src, target)) >= (olddist))
|
||||
frustration++
|
||||
else
|
||||
frustration = 0
|
||||
else
|
||||
back_to_idle()
|
||||
|
||||
if(BOT_START_PATROL)
|
||||
look_for_perp()
|
||||
start_patrol()
|
||||
|
||||
if(BOT_PATROL)
|
||||
look_for_perp()
|
||||
bot_patrol()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/proc/back_to_idle()
|
||||
anchored = FALSE
|
||||
mode = BOT_IDLE
|
||||
target = null
|
||||
last_found = world.time
|
||||
frustration = 0
|
||||
INVOKE_ASYNC(src, .proc/handle_automated_action) //responds quickly
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/proc/back_to_hunt()
|
||||
anchored = FALSE
|
||||
frustration = 0
|
||||
mode = BOT_HUNT
|
||||
INVOKE_ASYNC(src, .proc/handle_automated_action) // responds quickly
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/proc/look_for_perp()
|
||||
anchored = FALSE
|
||||
for(var/mob/living/carbon/C in view(7, src))
|
||||
if((C.stat) || (C.handcuffed))
|
||||
continue
|
||||
|
||||
if((C.name == oldtarget_name) && (world.time < last_found + 100))
|
||||
continue
|
||||
|
||||
if(threatlevel <= 3)
|
||||
if(C in view(4, src)) //keep the range short for patrolling
|
||||
if(!spam_flag)
|
||||
bike_horn()
|
||||
else if(threatlevel >= 10)
|
||||
bike_horn() //just spam the shit outta this
|
||||
else if(threatlevel >= 4)
|
||||
if(!spam_flag)
|
||||
target = C
|
||||
oldtarget_name = C.name
|
||||
bike_horn()
|
||||
speak("Honk!")
|
||||
visible_message("<b>[src]</b> starts chasing [C.name]!")
|
||||
mode = BOT_HUNT
|
||||
INVOKE_ASYNC(src, .proc/handle_automated_action)
|
||||
break
|
||||
else
|
||||
continue
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/explode()
|
||||
walk_to(src, 0)
|
||||
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
|
||||
var/turf/Tsec = get_turf(src)
|
||||
//doesn't drop cardboard nor its assembly, since its a very frail material.
|
||||
if(prob(50))
|
||||
new /obj/item/robot_parts/r_arm(Tsec)
|
||||
new /obj/item/bikehorn(Tsec)
|
||||
new /obj/item/assembly/prox_sensor(Tsec)
|
||||
|
||||
var/datum/effect_system/spark_spread/s = new
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/attack_alien(var/mob/living/carbon/alien/user as mob)
|
||||
..()
|
||||
if(!isalien(target))
|
||||
target = user
|
||||
mode = BOT_HUNT
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/Crossed(atom/movable/AM)
|
||||
if(ismob(AM) && on) //only if its online
|
||||
if(prob(30)) //you're far more likely to trip on a honkbot
|
||||
var/mob/living/carbon/C = AM
|
||||
if(!istype(C) || !C || in_range(src, target))
|
||||
return
|
||||
C.visible_message("<span class='warning'>[pick( \
|
||||
"[C] dives out of [src]'s way!", \
|
||||
"[C] stumbles over [src]!", \
|
||||
"[C] jumps out of [src]'s path!", \
|
||||
"[C] trips over [src] and falls!", \
|
||||
"[C] topples over [src]!", \
|
||||
"[C] leaps out of [src]'s way!")]</span>")
|
||||
C.Weaken(5)
|
||||
playsound(loc, 'sound/misc/sadtrombone.ogg', 50, 1, -1)
|
||||
if(!client)
|
||||
speak("Honk!")
|
||||
sensor_blink()
|
||||
return
|
||||
..()
|
||||
@@ -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)
|
||||
|
||||
@@ -177,3 +177,57 @@
|
||||
minbodytemp = 0
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 15
|
||||
|
||||
/mob/living/simple_animal/pet/cat/cak
|
||||
name = "Keeki"
|
||||
desc = "It's a cat made out of cake."
|
||||
icon_state = "cak"
|
||||
icon_living = "cak"
|
||||
icon_resting = "cak_rest"
|
||||
icon_dead = "cak_dead"
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
harm_intent_damage = 10
|
||||
butcher_results = list(
|
||||
/obj/item/organ/internal/brain = 1,
|
||||
/obj/item/organ/internal/heart = 1,
|
||||
/obj/item/reagent_containers/food/snacks/birthdaycakeslice = 3,
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab = 2
|
||||
)
|
||||
response_harm = "takes a bite out of"
|
||||
attacked_sound = "sound/items/eatfood.ogg"
|
||||
deathmessage = "loses its false life and collapses!"
|
||||
death_sound = "bodyfall"
|
||||
|
||||
/mob/living/simple_animal/pet/cat/cak/Life()
|
||||
..()
|
||||
if(stat)
|
||||
return
|
||||
if(health < maxHealth)
|
||||
adjustBruteLoss(-4)
|
||||
for(var/obj/item/reagent_containers/food/snacks/donut/D in range(1, src))
|
||||
if(D.icon_state != "donut2")
|
||||
D.name = "frosted donut"
|
||||
D.icon_state = "donut2"
|
||||
D.reagents.add_reagent("sprinkles", 2)
|
||||
D.filling_color = "#FF69B4"
|
||||
|
||||
/mob/living/simple_animal/pet/cat/cak/attack_hand(mob/living/L)
|
||||
..()
|
||||
if(L.a_intent == INTENT_HARM && L.reagents && !stat)
|
||||
L.reagents.add_reagent("nutriment", 0.4)
|
||||
L.reagents.add_reagent("vitamin", 0.4)
|
||||
|
||||
/mob/living/simple_animal/pet/cat/cak/CheckParts(list/parts)
|
||||
..()
|
||||
var/obj/item/organ/internal/brain/B = locate(/obj/item/organ/internal/brain) in contents
|
||||
if(!B || !B.brainmob || !B.brainmob.mind)
|
||||
return
|
||||
B.brainmob.mind.transfer_to(src)
|
||||
to_chat(src, "<span class='big bold'>You are a cak!</span><b> You're a harmless cat/cake hybrid that everyone loves. People can take bites out of you if they're hungry, but you regenerate health \
|
||||
so quickly that it generally doesn't matter. You're remarkably resilient to any damage besides this and it's hard for you to really die at all. You should go around and bring happiness and \
|
||||
free cake to the station!</b>")
|
||||
var/new_name = stripped_input(src, "Enter your name, or press \"Cancel\" to stick with Keeki.", "Name Change")
|
||||
if(new_name)
|
||||
to_chat(src, "<span class='notice'>Your name is now <b>\"[new_name]\"</b>!</span>")
|
||||
name = new_name
|
||||
@@ -620,4 +620,4 @@
|
||||
. = ..(gibbed)
|
||||
if(!.)
|
||||
return FALSE
|
||||
do_sparks(3, 1, src)
|
||||
do_sparks(3, 1, src)
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
icon_state = "mouse_gray"
|
||||
icon_living = "mouse_gray"
|
||||
icon_dead = "mouse_gray_dead"
|
||||
icon_resting = "mouse_gray_sleep"
|
||||
speak = list("Squeek!","SQUEEK!","Squeek?")
|
||||
speak_emote = list("squeeks","squeaks","squiks")
|
||||
emote_hear = list("squeeks","squeaks","squiks")
|
||||
@@ -69,6 +70,7 @@
|
||||
icon_state = "mouse_[mouse_color]"
|
||||
icon_living = "mouse_[mouse_color]"
|
||||
icon_dead = "mouse_[mouse_color]_dead"
|
||||
icon_resting = "mouse_[mouse_color]_sleep"
|
||||
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()
|
||||
@@ -121,7 +123,7 @@
|
||||
|
||||
if(on_CD == 1)
|
||||
return
|
||||
|
||||
|
||||
switch(act)
|
||||
if("squeak")
|
||||
message = "<B>\The [src]</B> squeaks!"
|
||||
@@ -207,4 +209,16 @@
|
||||
|
||||
/mob/living/simple_animal/mouse/blobinfected/get_scooped(mob/living/carbon/grabber)
|
||||
to_chat(grabber, "<span class='warning'>You try to pick up [src], but they slip out of your grasp!</span>")
|
||||
to_chat(src, "<span class='warning'>[src] tries to pick you up, but you wriggle free of their grasp!</span>")
|
||||
to_chat(src, "<span class='warning'>[src] tries to pick you up, but you wriggle free of their grasp!</span>")
|
||||
|
||||
/mob/living/simple_animal/mouse/fluff/clockwork
|
||||
name = "Chip"
|
||||
real_name = "Chip"
|
||||
mouse_color = "clockwork"
|
||||
icon_state = "mouse_clockwork"
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "stamps on"
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
|
||||
can_collar = 0
|
||||
butcher_results = list(/obj/item/stack/sheet/metal = 1)
|
||||
@@ -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"
|
||||
|
||||
@@ -74,4 +74,5 @@
|
||||
a_intent = INTENT_HARM
|
||||
pass_flags = PASSTABLE
|
||||
universal_speak = 1
|
||||
universal_understand = 1
|
||||
universal_understand = 1
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //badmin only
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/mob/living/simple_animal/hostile/hellhound
|
||||
// Sprites by FoS: http://nanotrasen.se/phpBB3/memberlist.php?mode=viewprofile&u=386
|
||||
name = "Lesser Hellhound"
|
||||
desc = "A horrifying, black canine monster, with glowing red eyes and vicious-looking teeth. A firey, lava-like substance drips from it."
|
||||
desc = "A demonic-looking black canine monster with glowing red eyes and sharp teeth. A firey, lava-like substance drips from it."
|
||||
icon_state = "hellhound"
|
||||
icon_living = "hellhound"
|
||||
icon_dead = "hellhound_dead"
|
||||
@@ -97,7 +97,7 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/hellhound/AttackingTarget()
|
||||
. = ..()
|
||||
if(ishuman(target))
|
||||
if(ishuman(target) && (!client || a_intent == INTENT_HARM))
|
||||
special_aoe()
|
||||
|
||||
/mob/living/simple_animal/hostile/hellhound/attackby(obj/item/C, mob/user, params)
|
||||
@@ -117,6 +117,7 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/hellhound/greater
|
||||
name = "Greater Hellhound"
|
||||
desc = "A demonic-looking black canine monster with glowing red eyes and sharp teeth. Greater hounds are far stronger than their lesser kin, and typically employed by powerful bluespace entities."
|
||||
icon_state = "hellhoundgreater"
|
||||
icon_living = "hellhoundgreater"
|
||||
icon_resting = "hellhoundgreater_sit"
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
melee_damage_upper = 3
|
||||
attacktext = "claws"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
projectilesound = 'sound/weapons/Gunshot.ogg'
|
||||
projectilesound = 'sound/weapons/gunshots/gunshot.ogg'
|
||||
projectiletype = /obj/item/projectile/hivebotbullet
|
||||
faction = list("hivebot")
|
||||
check_friendly_fire = 1
|
||||
|
||||
@@ -189,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"
|
||||
|
||||
@@ -76,6 +76,7 @@
|
||||
var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions
|
||||
var/list/loot = list() //list of things spawned at mob's loc when it dies
|
||||
var/del_on_death = 0 //causes mob to be deleted on death, useful for mobs that spawn lootable corpses
|
||||
var/attacked_sound = "punch"
|
||||
var/deathmessage = ""
|
||||
var/death_sound = null //The sound played on death
|
||||
|
||||
|
||||
@@ -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