Merge remote-tracking branch 'refs/remotes/origin/master' into Intent-defines

This commit is contained in:
Sam
2017-06-10 10:16:33 +01:00
88 changed files with 1372 additions and 127 deletions
+3 -1
View File
@@ -101,7 +101,9 @@ var/global/nologevent = 0
<br><br>
[check_rights(R_ADMIN,0) ? "<A href='?_src_=holder;traitor=\ref[M]'>Traitor panel</A> | " : "" ]
<A href='?_src_=holder;narrateto=\ref[M]'>Narrate to</A> |
<A href='?_src_=holder;subtlemessage=\ref[M]'>Subtle message</A>
<A href='?_src_=holder;subtlemessage=\ref[M]'>Subtle message</A> |
<A href='?_src_=holder;Bless=[M.UID()]'>Bless</A> |
<A href='?_src_=holder;Smite=[M.UID()]'>Smite</A>
"}
if(M.client)
+2 -1
View File
@@ -229,7 +229,8 @@ var/list/admin_verbs_snpc = list(
verbs += /client/proc/togglebuildmodeself
if(holder.rights & R_ADMIN)
verbs += admin_verbs_admin
control_freak = 0
spawn(1)
control_freak = 0
if(holder.rights & R_BAN)
verbs += admin_verbs_ban
if(holder.rights & R_EVENT)
+100 -1
View File
@@ -1546,7 +1546,7 @@
to_chat(X, take_msg)
else if(is_mhelp && check_rights(R_MOD|R_MENTOR, 0, X.mob))
to_chat(X, take_msg)
to_chat(M, "<span class='notice'><b>Your question is being attended to by [key_name(usr.client)]. Thanks for your patience!</b></span>")
to_chat(M, "<span class='notice'><b>Your question is being attended to by [key_name(usr.client, null, 0)]. Thanks for your patience!</b></span>")
else
to_chat(usr, "<span class='warning'>Unable to locate mob.</span>")
@@ -1790,9 +1790,15 @@
H = M
ptypes += "Brain Damage"
ptypes += "Honk Tumor"
ptypes += "Hallucinate"
ptypes += "Cold"
ptypes += "Hunger"
ptypes += "Cluwne"
ptypes += "Mutagen Cookie"
ptypes += "Hellwater Cookie"
ptypes += "Assassin"
ptypes += "Priest"
ptypes += "Lynch"
var/punishment = input(owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes
if(!(punishment in ptypes))
return
@@ -1820,6 +1826,15 @@
to_chat(H, "<span class='userdanger'>Life seems funnier, somehow.</span>")
organ.insert(H)
logmsg = "a honk tumor."
if("Hallucinate")
H.Hallucinate(1000)
logmsg = "hallucinations."
if("Hunger")
H.nutrition = NUTRITION_LEVEL_CURSED
logmsg = "starvation."
if("Cold")
H.reagents.add_reagent("frostoil", 40)
H.reagents.add_reagent("ice", 40)
if("Cluwne")
H.makeCluwne()
logmsg = "cluwned."
@@ -1828,6 +1843,7 @@
evilcookie.reagents.add_reagent("mutagen", 10)
evilcookie.desc = "It has a faint green glow."
evilcookie.bitesize = 100
evilcookie.flags = NODROP
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a mutagen cookie."
@@ -1836,9 +1852,92 @@
evilcookie.reagents.add_reagent("hell_water", 25)
evilcookie.desc = "Sulphur-flavored."
evilcookie.bitesize = 100
evilcookie.flags = NODROP
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a hellwater cookie."
if("Priest")
logmsg = "priest."
H.mutations |= NOCLONE
message_admins("[key_name_admin(owner)] is sending a dark priest to assassinate [key_name_admin(M)]...")
var/list/candidates = pollCandidates("Do you want to play as a murderous dark priest?")
if(!candidates.len)
to_chat(usr, "ERROR: Could not create priest. No valid candidates.")
return
var/mob/C = pick(candidates)
var/key_of_priest = C.key
if(!key_of_priest)
to_chat(usr, "ERROR: Could not create priest. Could not pick key.")
return
var/datum/mind/priest_mind = new /datum/mind(key_of_priest)
priest_mind.active = 1
var/mob/living/carbon/human/priest_mob = new /mob/living/carbon/human(pick(latejoin))
priest_mind.transfer_to(priest_mob)
var/datum/outfit/admin/dark_priest/O = new /datum/outfit/admin/dark_priest
priest_mob.equipOutfit(O, FALSE)
var/obj/item/weapon/pinpointer/advpinpointer/N = new /obj/item/weapon/pinpointer/advpinpointer(priest_mob)
priest_mob.equip_to_slot_or_del(N, slot_r_store)
N.active = 1
N.mode = 2
N.target = H
N.point_at(N.target)
N.flags |= NODROP
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = priest_mind
kill_objective.target = H.mind
kill_objective.explanation_text = "Murder [H.real_name], the [H.mind.assigned_role], in the name of the dark gods."
priest_mind.objectives += kill_objective
ticker.mode.traitors |= priest_mob.mind
to_chat(priest_mob, "<span class='danger'>ATTENTION:</span> You are now a dark priest!")
to_chat(priest_mob, "<B>Goal: <span class='danger'>MURDER [H.real_name]</span>, currently in [get_area(H.loc)], in the name of the dark gods. </B>");
to_chat(priest_mob, "<B>The gods will prevent their revival.</B>");
priest_mob.mind.special_role = SPECIAL_ROLE_TRAITOR
var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR]
tatorhud.join_hud(priest_mob)
ticker.mode.set_antag_hud(priest_mob, "hudsyndicate")
if("Assassin")
logmsg = "assassin."
var/list/possible_traitors = list()
for(var/mob/living/player in living_mob_list)
if(player.client && player.mind && !player.mind.special_role && player.stat != DEAD && player != H)
if(ishuman(player))
if(player.client && (ROLE_TRAITOR in player.client.prefs.be_special) && !jobban_isbanned(player, ROLE_TRAITOR) && !jobban_isbanned(player, "Syndicate"))
possible_traitors += player.mind
for(var/datum/mind/player in possible_traitors)
if(player.current)
if(ismindshielded(player.current))
possible_traitors -= player
if(possible_traitors.len)
var/datum/mind/newtraitormind = pick(possible_traitors)
var/mob/living/newtraitor = newtraitormind.current
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = newtraitormind
kill_objective.target = H.mind
kill_objective.explanation_text = "Assassinate [H.real_name], the [H.mind.assigned_role]."
newtraitormind.objectives += kill_objective
ticker.mode.equip_traitor(newtraitor)
ticker.mode.traitors |= newtraitor.mind
to_chat(newtraitor, "<span class='danger'>ATTENTION:</span> It is time to pay your debt to the Syndicate...")
to_chat(newtraitor, "<B>You are now a traitor.</B>")
to_chat(newtraitor, "<B>Goal: <span class='danger'>KILL [H.real_name]</span>, currently in [get_area(H.loc)]</B>");
newtraitor.mind.special_role = SPECIAL_ROLE_TRAITOR
var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR]
tatorhud.join_hud(newtraitor)
ticker.mode.set_antag_hud(newtraitor, "hudsyndicate")
else
to_chat(usr, "ERROR: Failed to create a traitor.")
return
if("Lynch")
logmsg = "lynch."
for(var/datum/mind/crew in ticker.minds)
if(!crew.current)
continue
if(!isliving(crew.current))
continue
if(crew == H.mind)
continue
to_chat(crew.current, "<BR><span class='userdanger'>The gods have given you a task: find [H.real_name], located in [get_area(H.loc)], and slay them!</span>");
to_chat(crew.current, "<span class='userdanger'>Do not harm anyone other than [H.real_name] while carrying out this task.</span><BR>");
if("Gib")
logmsg = "gibbed."
M.gib(FALSE)
+1 -1
View File
@@ -37,7 +37,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/weapon/claymore(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/claymore/highlander(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(H.loc), slot_l_store)
+1 -3
View File
@@ -76,8 +76,6 @@
"off" = "borgmacro")
)
var/reset_stretch = 0 //Used by things that fiddle with client's stretch-to-fit.
var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier
control_freak = CONTROL_FREAK_ALL | CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS
@@ -93,7 +91,7 @@
// Donator stuff.
var/donator_level = DONATOR_LEVEL_NONE
// If set to true, this client can interact with atoms such as buttons and doors on top of regular machinery interaction
var/advanced_admin_interaction = FALSE
+90
View File
@@ -0,0 +1,90 @@
/*
* ViewMods Client module
* This should be used by anything that wants to change a client's view range.
* Also includes
*/
/* Defines */
#define CUSTOM_VIEWRANGES list(1, 2, 3, 4, 5, 6, "RESET")
/* Viewmods */
/client
var/list/ViewMods = list()
var/ViewModsActive = FALSE
var/ViewPreferedIconSize = 0
/client/proc/AddViewMod(id, size)
var/datum/viewmod/V = new /datum/viewmod(id, size)
ViewMods[V.id] = V
UpdateView()
/client/proc/CheckViewMod(id)
. = 0
if(ViewMods[id])
. = 1
/client/proc/RemoveViewMod(id)
if(CheckViewMod(id))
qdel(ViewMods[id])
ViewMods.Remove(id)
UpdateView()
/client/proc/UpdateView()
if(!ViewModsActive)
ViewPreferedIconSize = winget(src, "mapwindow.map", "icon-size")
var/highest_range = 0
for(var/mod_id in ViewMods)
var/datum/viewmod/V = ViewMods[mod_id]
highest_range = max(highest_range, V.size)
SetView(highest_range ? highest_range : world.view)
ViewModsActive = (highest_range > 0)
/client/proc/SetView(view_range)
if(view_range == world.view)
winset(src, "mapwindow.map", "icon-size=[ViewPreferedIconSize]")
else
winset(src, "mapwindow.map", "icon-size=0")
view = view_range
if(mob && mob.hud_used)
// If view range is less than world.view, assume the HUD will not fit under normal mode and turn it to reduced
if(view_range < world.view)
// If it's really tiny, turn their hud off completely
if(view_range <= ARBITRARY_VIEWRANGE_NOHUD)
mob.hud_used.show_hud(HUD_STYLE_NOHUD)
else
mob.hud_used.show_hud(HUD_STYLE_REDUCED)
else
mob.hud_used.show_hud(HUD_STYLE_STANDARD)
/* Viewmod datums */
/datum/viewmod
var/id = ""
var/size = -1
/datum/viewmod/New(new_id, new_size = world.view)
. = ..()
id = new_id
size = new_size
/* Client verbs */
/proc/viewNum_to_text(view)
return "[(view * 2) + 1]x[(view * 2) + 1]"
/client/verb/set_view_range(view_range as null|anything in CUSTOM_VIEWRANGES)
set name = "Set View Range"
set category = "Preferences"
if(!view_range)
return
RemoveViewMod("custom")
if(view_range == "RESET")
to_chat(src, "<span class='notice'>View range reset.</span>")
return
to_chat(src, "<span class='notice'>View range set to [viewNum_to_text(view_range)]</span>")
AddViewMod("custom", view_range)
@@ -17,6 +17,13 @@
icon_state = "black"
item_state = "r_hands"
/obj/item/clothing/gloves/color/black/forensics
name = "forensics gloves"
desc = "These high-tech gloves don't leave any material traces on objects they touch. Perfect for leaving crime scenes undisturbed...both before and after the crime."
icon_state = "forensics"
can_leave_fibers = FALSE
/obj/item/clothing/gloves/combat
desc = "These tactical gloves are somewhat fire and impact resistant."
name = "combat gloves"
@@ -124,4 +131,4 @@
to_chat(user, "<span class='notice'>You cut [cell] away from [src].</span>")
cell.forceMove(get_turf(loc))
cell = null
update_icon()
update_icon()
+18 -1
View File
@@ -307,9 +307,26 @@
/obj/item/weapon/bikehorn)
category = CAT_MISC
/datum/crafting_recipe/blackcarpet
name = "Black Carpet"
result = /obj/item/stack/tile/carpet/black
time = 20
reqs = list(/obj/item/stack/tile/carpet = 1)
tools = list(/obj/item/toy/crayon)
category = CAT_MISC
/datum/crafting_recipe/showercurtain
name = "Shower Curtains"
result = /obj/structure/curtain
time = 20
reqs = list(/obj/item/stack/sheet/cloth = 2,
/obj/item/stack/sheet/plastic = 2,
/obj/item/stack/rods = 1)
category = CAT_MISC
/datum/crafting_recipe/bonfire
name = "Bonfire"
time = 60
reqs = list(/obj/item/weapon/grown/log = 5)
result = /obj/structure/bonfire
category = CAT_PRIMAL
category = CAT_PRIMAL
+72
View File
@@ -360,6 +360,68 @@
return
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
/obj/item/device/fluff/lighty_plasman_modkit // LightFire53: Ikelos
name = "plasmaman suit modkit"
desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments."
icon_state = "modkit"
w_class = 2
force = 0
throwforce = 0
var/picked_color = null
var/list/helmets = list(
"Blue" = "plasmaman_ikelosdefault_helmet",
"Gold" = "plasmaman_ikelosgold_helmet",
"Red" = "plasmaman_ikelossecurity_helmet")
var/list/suits = list(
"Blue" = "plasmaman_ikelosdefault",
"Gold" = "plasmaman_ikelosgold",
"Red" = "plasmaman_ikelossecurity")
/obj/item/device/fluff/lighty_plasman_modkit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
var/mob/living/carbon/human/H = user
if(istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman))
if(used & USED_MOD_HELM)
to_chat(H, "<span class='notice'>The kit's helmet modifier has already been used.</span>")
return
picked_color = input(H, "Which color would you like to paint [target]?", "Recolor") as null|anything in helmets
var/obj/item/clothing/head/helmet/space/eva/plasmaman/P = target
if(!picked_color)
return
P.icon_state = helmets[picked_color] + "[P.on]"
P.base_state = helmets[picked_color]
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
P.icon = 'icons/obj/custom_items.dmi'
used |= USED_MOD_HELM
if(P == H.head)
H.update_inv_head()
return
if(istype(target, /obj/item/clothing/suit/space/eva/plasmaman))
if(used & USED_MOD_SUIT)
to_chat(user, "<span class='notice'>The kit's suit modifier has already been used.</span>")
return
picked_color = input(H, "Which color would you like to paint [target]?", "Recolor") as null|anything in suits
var/obj/item/clothing/suit/space/eva/plasmaman/P = target
if(!picked_color)
return
P.icon_state = suits[picked_color]
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
P.icon = 'icons/obj/custom_items.dmi'
used |= USED_MOD_SUIT
if(P == H.wear_suit)
H.update_inv_wear_suit()
return
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
#undef USED_MOD_HELM
#undef USED_MOD_SUIT
@@ -706,6 +768,16 @@
item_state = "castile_dress"
item_color = "castile_dress"
/obj/item/clothing/under/fluff/xantholne //Xantholne: Meex Zwichsnicrur
name = "Stripped Shorts and Shirt"
desc = "A silky pair of dark shorts with a matching shirt. The shirt's collar has a tag on the inside that reads 'Meexy' on it."
icon = 'icons/obj/custom_items.dmi'
lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
icon_state = "xantholne"
item_state = "xantholne"
item_color = "xantholne"
/obj/item/clothing/under/fluff/elishirt // FlattestGuitar9: Eli Randolph
name = "casual dress shirt"
desc = "A soft, white dress shirt paired up with black suit pants. The set looks comfortable."
@@ -16,33 +16,33 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
var/item_multiplier = istype(src,/obj/item)?1.2:1
if(M.wear_suit)
fibertext = "Material from \a [M.wear_suit]."
if(prob(10*item_multiplier) && !(fibertext in suit_fibers))
if(prob(10*item_multiplier) && !(fibertext in suit_fibers) && M.wear_suit.can_leave_fibers)
//log_to_dd("Added fibertext: [fibertext]")
suit_fibers += fibertext
if(!(M.wear_suit.body_parts_covered & UPPER_TORSO))
if(M.w_uniform)
fibertext = "Fibers from \a [M.w_uniform]."
if(prob(12*item_multiplier) && !(fibertext in suit_fibers)) //Wearing a suit means less of the uniform exposed.
if(prob(12*item_multiplier) && !(fibertext in suit_fibers) && M.w_uniform.can_leave_fibers) //Wearing a suit means less of the uniform exposed.
//log_to_dd("Added fibertext: [fibertext]")
suit_fibers += fibertext
if(!(M.wear_suit.body_parts_covered & HANDS))
if(M.gloves)
fibertext = "Material from a pair of [M.gloves.name]."
if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers)
//log_to_dd("Added fibertext: [fibertext]")
suit_fibers += fibertext
else if(M.w_uniform)
fibertext = "Fibers from \a [M.w_uniform]."
if(prob(15*item_multiplier) && !(fibertext in suit_fibers))
if(prob(15*item_multiplier) && !(fibertext in suit_fibers) && M.w_uniform.can_leave_fibers)
// "Added fibertext: [fibertext]"
suit_fibers += fibertext
if(M.gloves)
fibertext = "Material from a pair of [M.gloves.name]."
if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers)
//log_to_dd("Added fibertext: [fibertext]")
suit_fibers += "Material from a pair of [M.gloves.name]."
else if(M.gloves)
fibertext = "Material from a pair of [M.gloves.name]."
if(prob(20*item_multiplier) && !(fibertext in suit_fibers))
if(prob(20*item_multiplier) && !(fibertext in suit_fibers) && M.gloves.can_leave_fibers)
//log_to_dd("Added fibertext: [fibertext]")
suit_fibers += "Material from a pair of [M.gloves.name]."
suit_fibers += "Material from a pair of [M.gloves.name]."
+2
View File
@@ -7,6 +7,8 @@
var/datum/martial_art/base = null // The permanent style
var/deflection_chance = 0 //Chance to deflect projectiles
var/help_verb = null
var/no_guns = FALSE //set to TRUE to prevent users of this style from using guns (sleeping carp, highlander). They can still pick them up, but not fire them.
var/no_guns_message = "" //message to tell the style user if they try and use a gun while no_guns = TRUE (DISHONORABRU!)
/datum/martial_art/proc/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
return 0
@@ -8,6 +8,8 @@
name = "The Sleeping Carp"
deflection_chance = 100
help_verb = /mob/living/carbon/human/proc/sleeping_carp_help
no_guns = TRUE
no_guns_message = "Use of ranged weaponry would bring dishonor to the clan."
/datum/martial_art/the_sleeping_carp/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(findtext(streak,WRIST_WRENCH_COMBO))
+54
View File
@@ -333,8 +333,28 @@
new /obj/effect/effect/harmless_smoke(get_turf(src))
qdel(src)
/obj/item/weapon/survivalcapsule/luxury
name = "luxury bluespace shelter capsule"
desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace."
origin_tech = "engineering=3;bluespace=4"
template_id = "shelter_beta"
//Pod turfs and objects
//Window
/obj/structure/window/reinforced/survival_pod
name = "pod window"
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "pwindow"
// This override can be removed whenever we get rid of the stupid fucking `dir = 9` = full tile!!!! shit
/obj/structure/window/reinforced/survival_pod/CanPass(atom/movable/mover, turf/target, height=0)
if(istype(mover) && mover.checkpass(PASSGLASS))
return 1
if(get_dir(loc, target) == dir)
return !density
else
return 1
//Floors
/turf/simulated/floor/pod
@@ -364,6 +384,12 @@
base_icon_state = "survival_pod"
glass_type = "/survival_pod"
//Windoor
/obj/machinery/door/window/survival_pod
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "windoor"
base_state = "windoor"
//Table
/obj/structure/table/survival_pod
icon = 'icons/obj/lavaland/survival_pod.dmi'
@@ -536,3 +562,31 @@
new /obj/item/stack/rods(loc)
qdel(src)
return ..()
/obj/item/fakeartefact
name = "expensive forgery"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x2"
var/possible = list(/obj/item/ship_in_a_bottle,
/obj/item/weapon/gun/energy/pulse,
/obj/item/weapon/sleeping_carp_scroll,
/obj/item/weapon/shield/changeling,
/obj/item/weapon/lava_staff,
/obj/item/weapon/katana/energy,
/obj/item/weapon/storage/toolbox/green/memetic,
/obj/item/weapon/gun/projectile/automatic/l6_saw,
/obj/item/weapon/gun/magic/staff/chaos,
/obj/item/weapon/gun/magic/staff/spellblade,
/obj/item/weapon/gun/magic/wand/death,
/obj/item/weapon/gun/magic/wand/fireball,
/obj/item/stack/telecrystal,
/obj/item/weapon/banhammer)
/obj/item/fakeartefact/New()
. = ..()
var/obj/item/I = pick(possible)
name = initial(I.name)
icon = initial(I.icon)
desc = initial(I.desc)
icon_state = initial(I.icon_state)
item_state = initial(I.item_state)
+14
View File
@@ -40,3 +40,17 @@
/datum/map_template/shelter/alpha/New()
. = ..()
whitelisted_turfs = typecacheof(/turf/simulated/mineral)
/datum/map_template/shelter/beta
name = "Shelter Beta"
shelter_id = "shelter_beta"
description = "An extremly luxurious shelter, containing all \
the amenities of home, including carpeted floors, hot and cold \
running water, a gourmet three course meal, cooking facilities, \
and a deluxe companion to keep you from getting lonely during \
an ash storm."
mappath = "_maps/map_files/templates/shelter_2.dmm"
/datum/map_template/shelter/beta/New()
. = ..()
whitelisted_turfs = typecacheof(/turf/simulated/mineral)
@@ -1985,8 +1985,8 @@
to_chat(src, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
return 0
if(martial_art && martial_art.name == "The Sleeping Carp") //great dishonor to famiry
to_chat(src, "<span class='warning'>Use of ranged weaponry would bring dishonor to the clan.</span>")
if(martial_art && martial_art.no_guns) //great dishonor to famiry
to_chat(src, "<span class='warning'>[martial_art.no_guns_message]</span>")
return 0
return .
@@ -37,12 +37,85 @@
icon_resting = "cat_rest"
gender = FEMALE
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
var/list/family = list()
var/memory_saved = 0
var/list/children = list() //Actual mob instances of children
var/cats_deployed = 0
/mob/living/simple_animal/pet/cat/Runtime/New()
Read_Memory()
..()
/mob/living/simple_animal/pet/cat/Runtime/Life()
if(!cats_deployed && ticker.current_state >= GAME_STATE_SETTING_UP)
Deploy_The_Cats()
if(!stat && ticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory()
..()
/mob/living/simple_animal/pet/cat/Runtime/make_babies()
var/mob/baby = ..()
if(baby)
children += baby
return baby
/mob/living/simple_animal/pet/cat/Runtime/death()
if(!memory_saved)
Write_Memory(1)
..()
/mob/living/simple_animal/pet/cat/Runtime/proc/Read_Memory()
var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
S["family"] >> family
if(isnull(family))
family = list()
/mob/living/simple_animal/pet/cat/Runtime/proc/Write_Memory(dead)
var/savefile/S = new /savefile("data/npc_saves/Runtime.sav")
family = list()
if(!dead)
for(var/mob/living/simple_animal/pet/cat/kitten/C in children)
if(istype(C,type) || C.stat || !C.z || !C.butcher_results)
continue
if(C.type in family)
family[C.type] += 1
else
family[C.type] = 1
S["family"] << family
memory_saved = 1
/mob/living/simple_animal/pet/cat/Runtime/proc/Deploy_The_Cats()
cats_deployed = 1
for(var/cat_type in family)
if(family[cat_type] > 0)
for(var/i in 1 to min(family[cat_type],100)) //Limits to about 500 cats, you wouldn't think this would be needed (BUT IT IS)
new cat_type(loc)
/mob/living/simple_animal/pet/cat/handle_automated_action()
..()
if(prob(1))
custom_emote(1, pick("stretches out for a belly rub.", "wags its tail.", "lies down."))
icon_state = "[icon_living]_rest"
resting = 1
update_canmove()
else if (prob(1))
custom_emote(1, pick("sits down.", "crouches on its hind legs.", "looks alert."))
icon_state = "[icon_living]_sit"
resting = 1
update_canmove()
else if (prob(1))
if (resting)
custom_emote(1, pick("gets up and meows.", "walks around.", "stops resting."))
icon_state = "[icon_living]"
resting = 0
update_canmove()
else
custom_emote(1, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat."))
//MICE!
if(eats_mice && loc && isturf(loc) && !incapacitated())
if(eats_mice && isturf(loc) && !incapacitated())
for(var/mob/living/simple_animal/mouse/M in view(1,src))
if(!M.stat && Adjacent(M))
custom_emote(1, "splats \the [M]!")
@@ -50,13 +123,11 @@
movement_target = null
stop_automated_movement = 0
break
//attempt to mate
make_babies()
/mob/living/simple_animal/pet/cat/handle_automated_movement()
..()
if(eats_mice && !incapacitated())
if(!stat && !resting && !buckled)
turns_since_scan++
if(turns_since_scan > 5)
walk_to(src,0)
@@ -75,6 +146,7 @@
stop_automated_movement = 1
walk_to(src,movement_target,0,3)
/mob/living/simple_animal/pet/cat/Proc
name = "Proc"
@@ -102,4 +174,4 @@
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
eats_mice = 0
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
minbodytemp = 0
@@ -12,7 +12,7 @@
response_help = "pets"
emote_hear = list("chitters")
maxHealth = 250
health = 200
health = 250
harm_intent_damage = 3
melee_damage_lower = 15
melee_damage_upper = 20
@@ -592,7 +592,7 @@
alone = 0
continue
if(alone && partner && children < 3)
new childtype(loc)
return new childtype(loc)
/mob/living/simple_animal/say_quote(var/message)
var/verb = "says"
-8
View File
@@ -149,14 +149,6 @@
/client/Move(n, direct)
if(viewingCanvas)
view = world.view //Reset the view
winset(src, "mapwindow.map", "icon-size=[src.reset_stretch]")
viewingCanvas = 0
mob.reset_perspective()
if(mob.hud_used)
mob.hud_used.show_hud(HUD_STYLE_STANDARD)
if(world.time < move_delay)
return
+6 -4
View File
@@ -122,6 +122,7 @@
fixture_type = "bulb"
sheets_refunded = 1
// the standard tube light fixture
/obj/machinery/light
name = "light fixture"
@@ -149,6 +150,7 @@
// this is used to calc the probability the light burns out
var/rigged = 0 // true if rigged to explode
var/lightmaterials = list(MAT_GLASS=100) //stores the materials the light is made of to stop infinite glass exploit
// the smaller bulb light fixture
@@ -305,6 +307,7 @@
brightness_range = L.brightness_range
brightness_power = L.brightness_power
brightness_color = L.brightness_color
lightmaterials = L.materials
on = has_power()
update()
@@ -472,6 +475,7 @@
L.brightness_range = brightness_range
L.brightness_power = brightness_power
L.brightness_color = brightness_color
L.materials = lightmaterials
// light item inherits the switchcount, then zero it
L.switchcount = switchcount
@@ -500,6 +504,7 @@
L.brightness_range = brightness_range
L.brightness_power = brightness_power
L.brightness_color = brightness_color
L.materials = lightmaterials
// light item inherits the switchcount, then zero it
L.switchcount = switchcount
@@ -596,7 +601,7 @@
var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN
var/base_state
var/switchcount = 0 // number of times switched
materials = list(MAT_METAL=60)
materials = list(MAT_GLASS=100)
var/rigged = 0 // true if rigged to explode
var/brightness_range = 2 //how much light it gives off
var/brightness_power = 1
@@ -608,7 +613,6 @@
icon_state = "ltube"
base_state = "ltube"
item_state = "c_tube"
materials = list(MAT_GLASS=100)
brightness_range = 8
/obj/item/weapon/light/tube/large
@@ -623,7 +627,6 @@
icon_state = "lbulb"
base_state = "lbulb"
item_state = "contvapour"
materials = list(MAT_GLASS=100)
brightness_range = 5
brightness_color = "#a0a080"
@@ -637,7 +640,6 @@
icon_state = "fbulb"
base_state = "fbulb"
item_state = "egg4"
materials = list(MAT_GLASS=100)
brightness_range = 5
// update the icon state and description of the light
+4 -4
View File
@@ -130,7 +130,7 @@
/obj/item/projectile/beam/instakill/on_hit(atom/target)
. = ..()
if(iscarbon(target))
var/mob/living/carbon/M = target
M.visible_message("<span class='danger'>[M] explodes into a shower of gibs!</span>")
M.gib()
if(isliving(target))
var/mob/living/L = target
L.visible_message("<span class='danger'>[L] explodes!</span>")
L.gib()
@@ -898,7 +898,7 @@
desc = "Allows for the construction of CH-PD Disabler."
id = "mech_laser"
build_type = MECHFAB
req_tech = list("combat" = 3, "magnets" = 3)
req_tech = list("combat" = 3)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/disabler
materials = list(MAT_METAL=10000)
construction_time = 100
@@ -977,7 +977,7 @@
build_type = MECHFAB
req_tech = list("combat" = 6, "magnets" = 5, "materials" = 5)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla
materials = list(MAT_METAL = 10000, MAT_GLASS = 10000, MAT_SILVER = 10000)
materials = list(MAT_METAL=20000,MAT_SILVER=8000)
construction_time = 100
category = list("Exosuit Equipment")
@@ -986,9 +986,9 @@
desc = "Allows for the construction of ZFI Immolation Beam Gun."
id = "mech_tesla"
build_type = MECHFAB
req_tech = list("combat" = 4, "materials" = 4, "plasmatech" = 2, "magnets" = 3)
req_tech = list("combat" = 6, "magnets" = 5, "materials" = 5)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/immolator
materials = list(MAT_METAL = 4000, MAT_GLASS = 1000, MAT_SILVER = 3000, MAT_PLASMA = 2000)
materials = list(MAT_METAL = 10000, MAT_SILVER = 8000, MAT_PLASMA = 8000)
construction_time = 100
category = list("Exosuit Equipment")
@@ -394,22 +394,22 @@
build_path = /obj/item/weapon/implantcase
category = list("Medical")
/datum/design/implant_freedom
name = "Freedom Implant Case"
/datum/design/implant_chem
name = "Chemical Implant Case"
desc = "A glass case containing an implant."
id = "implant_freedom"
req_tech = list("combat" = 6, "biotech" = 5, "magnets" = 3, "syndicate" = 3)
id = "implant_chem"
req_tech = list("materials" = 3, "biotech" = 5,)
build_type = PROTOLATHE
materials = list(MAT_METAL = 800, MAT_GLASS = 500, MAT_GOLD = 500)
build_path = /obj/item/weapon/implantcase/freedom
materials = list(MAT_GLASS = 700)
build_path = /obj/item/weapon/implantcase/chem
category = list("Medical")
/datum/design/implant_adrenalin
name = "Adrenalin Implant Case"
/datum/design/implant_tracking
name = "Tracking Implant Case"
desc = "A glass case containing an implant."
id = "implant_adrenalin"
req_tech = list("biotech" = 6, "combat" = 6, "syndicate" = 6)
id = "implant_tracking"
req_tech = list("materials" = 2, "biotech" = 3, "magnets" = 3, "programming" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_GOLD = 500, MAT_URANIUM = 600, MAT_DIAMOND = 600)
build_path = /obj/item/weapon/implantcase/adrenaline
materials = list(MAT_METAL = 500, MAT_GLASS = 500)
build_path = /obj/item/weapon/implantcase/track
category = list("Medical")
+1 -1
View File
@@ -263,7 +263,7 @@
timer = world.time
priority_announcement.Announce("The Emergency Shuttle has left the station. Estimate [timeLeft(600)] minutes until the shuttle docks at Central Command.")
for(var/mob/M in player_list)
if(!isnewplayer(M) && !M.client.karma_spent && !M.get_preference(DISABLE_KARMA_REMINDER))
if(!isnewplayer(M) && !M.client.karma_spent && !M.client.ckey in karma_spenders && !M.get_preference(DISABLE_KARMA_REMINDER))
to_chat(M, "<i>You have not yet spent your karma for the round; was there a player worthy of receiving your reward? Look under OOC tab, Award Karma.</i>")
if(SHUTTLE_ESCAPE)
+1
View File
@@ -245,6 +245,7 @@
/obj/machinery/teleport/station,
/obj/machinery/teleport/hub,
/obj/machinery/telepad,
/obj/machinery/telepad_cargo,
/obj/machinery/clonepod,
/obj/effect/hierophant,
/obj/item/device/warp_cube,
+5 -1
View File
@@ -327,6 +327,10 @@ var/list/organ_cache = list()
/obj/item/organ/proc/replaced(var/mob/living/carbon/human/target)
return // Nothing uses this, it is always overridden
// A version of `replaced` that "flattens" the process of insertion, making organs "Plug'n'play"
// (Particularly the heart, which stops beating when removed)
/obj/item/organ/proc/safe_replace(var/mob/living/carbon/human/target)
replaced(target)
/obj/item/organ/proc/surgeryize()
return
@@ -370,4 +374,4 @@ I use this so that this can be made better once the organ overhaul rolls out --
// The only thing the official proc does is
//instantiate the list and call this proc
dna.deserialize(data["dna"])
..()
..()
@@ -170,6 +170,10 @@
if(!owner)
Stop()
/obj/item/organ/internal/heart/safe_replace(mob/living/carbon/human/target)
Restart()
..()
/obj/item/organ/internal/heart/proc/Stop()
beating = 0
update_icon()