mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 00:23:29 +01:00
Merge conflict fix
This commit is contained in:
@@ -10,7 +10,9 @@ world/IsBanned(key,address,computer_id)
|
||||
var/admin = 0
|
||||
var/ckey = ckey(key)
|
||||
if((ckey in admin_datums) || (ckey in deadmins))
|
||||
admin = 1
|
||||
var/datum/admins/A = admin_datums[ckey]
|
||||
if(A.rights & R_ADMIN)
|
||||
admin = 1
|
||||
|
||||
//Guest Checking
|
||||
if(!guests_allowed && IsGuestKey(key))
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
<A href='?src=[UID()];secretsadmin=showgm'>Show Game Mode</A>
|
||||
<A href='?src=[UID()];secretsadmin=manifest'>Show Crew Manifest</A><br>
|
||||
<A href='?src=[UID()];secretsadmin=check_antagonist'>Show current traitors and objectives</A><BR>
|
||||
<a href='?src=[UID()];secretsadmin=night_shift_set'>Set Night Shift Mode</a><br>
|
||||
<B>Bombs</b><br>
|
||||
<A href='?src=[UID()];secretsadmin=list_bombers'>Bombing List</A>
|
||||
<A href='?src=[UID()];secretsadmin=clear_bombs'>Remove all bombs currently in existence</A>
|
||||
|
||||
@@ -887,7 +887,8 @@
|
||||
else if(href_list["boot2"])
|
||||
var/mob/M = locate(href_list["boot2"])
|
||||
if(ismob(M))
|
||||
if(!check_if_greater_rights_than(M.client))
|
||||
if(M.client && M.client.holder && (M.client.holder.rights & R_BAN))
|
||||
to_chat(src, "<span class='warning'>[key_name_admin(M)] cannot be kicked from the server.</span>")
|
||||
return
|
||||
to_chat(M, "<span class='warning'>You have been kicked from the server</span>")
|
||||
log_admin("[key_name(usr)] booted [key_name(M)].")
|
||||
@@ -960,8 +961,6 @@
|
||||
var/mob/M = locate(href_list["newban"])
|
||||
if(!ismob(M)) return
|
||||
|
||||
if(M.client && M.client.holder) return //admins cannot be banned. Even if they could, the ban doesn't affect them anyway
|
||||
|
||||
switch(alert("Temporary Ban?",,"Yes","No", "Cancel"))
|
||||
if("Yes")
|
||||
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
|
||||
@@ -3024,6 +3023,24 @@
|
||||
dat += "<tr><td>[H]</td><td>H.dna = null</td></tr>"
|
||||
dat += "</table>"
|
||||
usr << browse(dat, "window=fingerprints;size=440x410")
|
||||
if("night_shift_set")
|
||||
var/val = alert(usr, "What do you want to set night shift to? This will override the automatic system until set to automatic again.", "Night Shift", "On", "Off", "Automatic")
|
||||
switch(val)
|
||||
if("Automatic")
|
||||
if(config.enable_night_shifts)
|
||||
SSnightshift.can_fire = TRUE
|
||||
SSnightshift.fire()
|
||||
else
|
||||
SSnightshift.update_nightshift(FALSE, TRUE)
|
||||
to_chat(usr, "<span class='notice'>Night shift set to automatic.</span>")
|
||||
if("On")
|
||||
SSnightshift.can_fire = FALSE
|
||||
SSnightshift.update_nightshift(TRUE, FALSE)
|
||||
to_chat(usr, "<span class='notice'>Night shift forced on.</span>")
|
||||
if("Off")
|
||||
SSnightshift.can_fire = FALSE
|
||||
SSnightshift.update_nightshift(FALSE, FALSE)
|
||||
to_chat(usr, "<span class='notice'>Night shift forced off.</span>")
|
||||
else
|
||||
if(usr)
|
||||
log_admin("[key_name(usr)] used secret [href_list["secretsadmin"]]")
|
||||
|
||||
@@ -123,7 +123,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
T.addResponse(usr.client, msg)
|
||||
else
|
||||
ticketNum = globAdminTicketHolder.getTicketCounter() // ticketNum is the ticket ready to be assigned.
|
||||
msg = "<span class='adminhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;openadminticket=[ticketNum]'>TICKET</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""] :</span> <span class='adminhelp'>[msg]</span>"
|
||||
msg = "<span class='adminhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;openadminticket=[ticketNum]'>TICKET</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""](<A HREF='?_src_=holder;take_question=[mob.UID()]'>TAKE</A>) :</span> <span class='adminhelp'>[msg]</span>"
|
||||
//Open a new adminticket and inform the user.
|
||||
globAdminTicketHolder.newTicket(src, prunedmsg, msg)
|
||||
for(var/client/X in modholders + adminholders)
|
||||
|
||||
@@ -773,7 +773,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
set desc = "Force the client to redownload NanoUI Resources"
|
||||
|
||||
// Close open NanoUIs.
|
||||
nanomanager.close_user_uis(usr)
|
||||
SSnanoui.close_user_uis(usr)
|
||||
|
||||
// Re-load the assets.
|
||||
var/datum/asset/assets = get_asset_datum(/datum/asset/nanoui)
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
T.amount = "[token_price]"
|
||||
T.source_terminal = src.name
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
customer_account.transaction_log.Add(T)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -7,12 +7,16 @@
|
||||
|
||||
bomb_name = "tripwire mine"
|
||||
|
||||
secured = 0 // toggle_secure()'ed in New() for correct adding to processing_objects, won't work otherwise
|
||||
dir = EAST
|
||||
var/on = 0
|
||||
var/visible = 0
|
||||
var/visible = 1
|
||||
var/obj/effect/beam/i_beam/first = null
|
||||
var/obj/effect/beam/i_beam/last = null
|
||||
var/max_nesting_level = 10
|
||||
var/turf/fire_location
|
||||
var/emission_cycles = 0
|
||||
var/emission_cap = 20
|
||||
|
||||
/obj/item/device/assembly/infra/Destroy()
|
||||
if(first)
|
||||
@@ -22,7 +26,11 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/device/assembly/infra/describe()
|
||||
return "The infrared trigger is [on?"on":"off"]."
|
||||
return "The assembly is [secured ? "secure" : "not secure"]. The infrared trigger is [on ? "on" : "off"]."
|
||||
|
||||
/obj/item/device/assembly/infra/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, describe())
|
||||
|
||||
/obj/item/device/assembly/infra/activate()
|
||||
if(!..()) return 0//Cooldown check
|
||||
@@ -36,11 +44,22 @@
|
||||
processing_objects.Add(src)
|
||||
else
|
||||
on = 0
|
||||
if(first) qdel(first)
|
||||
if(first)
|
||||
qdel(first)
|
||||
processing_objects.Remove(src)
|
||||
update_icon()
|
||||
return secured
|
||||
|
||||
/obj/item/device/assembly/infra/New()
|
||||
..()
|
||||
if(!secured)
|
||||
toggle_secure()
|
||||
|
||||
/obj/item/device/assembly/infra/proc/arm() // Forces the device to arm no matter its current state.
|
||||
if(!secured) // Checked because arm() might be called sometime after the object is spawned.
|
||||
toggle_secure()
|
||||
on = 1
|
||||
|
||||
/obj/item/device/assembly/infra/update_icon()
|
||||
overlays.Cut()
|
||||
attached_overlays = list()
|
||||
@@ -51,38 +70,22 @@
|
||||
if(holder)
|
||||
holder.update_icon()
|
||||
|
||||
/obj/item/device/assembly/infra/proc/get_valid_loc(atom/A, atom/prev, level = 0)
|
||||
if(!A)
|
||||
A = loc
|
||||
if(!prev)
|
||||
prev = src
|
||||
if(level > max_nesting_level)
|
||||
return null
|
||||
else if(isturf(A))
|
||||
return A
|
||||
else if(isobj(A))
|
||||
var/obj/O = A
|
||||
if(isassembly(A) || O.IsAssemblyHolder() || istype(A, /obj/item/device/onetankbomb))
|
||||
return .(A.loc, A, level + 1)
|
||||
else if(ismob(A))
|
||||
var/mob/user = A
|
||||
if(user.get_active_hand() == prev || user.get_inactive_hand() == prev)
|
||||
return .(A.loc, A, level + 1)
|
||||
return null
|
||||
|
||||
/obj/item/device/assembly/infra/process()
|
||||
if(!on || fire_location != get_turf(loc))
|
||||
if(first)
|
||||
qdel(first)
|
||||
return
|
||||
var/turf/T = get_turf(src)
|
||||
if(first && (!on || !fire_location || fire_location != T || emission_cycles >= emission_cap))
|
||||
qdel(first)
|
||||
return
|
||||
if(!on)
|
||||
return
|
||||
if(!secured)
|
||||
return
|
||||
if(first && last)
|
||||
last.process()
|
||||
emission_cycles++
|
||||
return
|
||||
var/turf/T = get_valid_loc()
|
||||
if(T)
|
||||
fire_location = T
|
||||
emission_cycles = 0
|
||||
var/obj/effect/beam/i_beam/I = new /obj/effect/beam/i_beam(T)
|
||||
I.master = src
|
||||
I.density = 1
|
||||
@@ -124,6 +127,8 @@
|
||||
return 0
|
||||
pulse(0)
|
||||
audible_message("[bicon(src)] *beep* *beep*", null, 3)
|
||||
if(first)
|
||||
qdel(first)
|
||||
cooldown = 2
|
||||
spawn(10)
|
||||
process_cooldown()
|
||||
@@ -177,6 +182,21 @@
|
||||
if(usr.machine == src)
|
||||
interact(usr)
|
||||
|
||||
if(first)
|
||||
qdel(first)
|
||||
|
||||
|
||||
|
||||
/obj/item/device/assembly/infra/armed/New()
|
||||
..()
|
||||
spawn(3)
|
||||
if(holder)
|
||||
if(holder.master)
|
||||
dir = holder.master.dir
|
||||
arm()
|
||||
|
||||
/obj/item/device/assembly/infra/armed/stealth
|
||||
visible = 0
|
||||
|
||||
|
||||
/***************************IBeam*********************************/
|
||||
@@ -191,6 +211,8 @@
|
||||
var/limit = null
|
||||
var/visible = 0.0
|
||||
var/left = null
|
||||
var/life_cycles = 0
|
||||
var/life_cap = 20
|
||||
anchored = 1.0
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
|
||||
@@ -209,7 +231,8 @@
|
||||
transform = turn(matrix(), dir2angle(dir))
|
||||
|
||||
/obj/effect/beam/i_beam/process()
|
||||
if((loc.density || !(master)))
|
||||
life_cycles++
|
||||
if(loc.density || !master || life_cycles >= life_cap)
|
||||
qdel(src)
|
||||
return
|
||||
if(left > 0)
|
||||
|
||||
@@ -9,8 +9,8 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
|
||||
smoothTurfs = turfs
|
||||
|
||||
log_debug("Setting up atmos")
|
||||
if(air_master)
|
||||
air_master.setup_allturfs(turfs)
|
||||
if(SSair)
|
||||
SSair.setup_allturfs(turfs)
|
||||
log_debug("\tTook [stop_watch(subtimer)]s")
|
||||
|
||||
subtimer = start_watch()
|
||||
|
||||
@@ -478,6 +478,8 @@
|
||||
if(!tooltips)
|
||||
tooltips = new /datum/tooltip(src)
|
||||
|
||||
Master.UpdateTickRate()
|
||||
|
||||
//////////////
|
||||
//DISCONNECT//
|
||||
//////////////
|
||||
@@ -487,6 +489,7 @@
|
||||
admins -= src
|
||||
directory -= ckey
|
||||
clients -= src
|
||||
Master.UpdateTickRate()
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
@@ -79,3 +79,54 @@
|
||||
display_name = "Nano-Mob Hunter GO! Cartridge"
|
||||
path = /obj/item/weapon/cartridge/mob_hunt_game
|
||||
cost = 2
|
||||
|
||||
//////////////////////
|
||||
// Mugs //
|
||||
//////////////////////
|
||||
|
||||
/datum/gear/mug
|
||||
display_name = "random coffee mug"
|
||||
description = "A randomly colored coffee mug. You'll need to supply your own beverage though."
|
||||
path = /obj/item/weapon/reagent_containers/food/drinks/mug
|
||||
sort_category = "Mugs"
|
||||
|
||||
/datum/gear/novelty_mug
|
||||
display_name = "novelty coffee mug"
|
||||
description = "A random novelty coffee mug. You'll need to supply your own beverage though."
|
||||
path = /obj/item/weapon/reagent_containers/food/drinks/mug/novelty
|
||||
cost = 2
|
||||
sort_category = "Mugs"
|
||||
|
||||
/datum/gear/mug/department
|
||||
subtype_path = /datum/gear/mug/department
|
||||
sort_category = "Mugs"
|
||||
subtype_cost_overlap = FALSE
|
||||
|
||||
/datum/gear/mug/department/eng
|
||||
display_name = "engineer coffee mug"
|
||||
description = "An engineer's coffee mug, emblazoned in the colors of the Engineering department."
|
||||
allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist")
|
||||
path = /obj/item/weapon/reagent_containers/food/drinks/mug/eng
|
||||
|
||||
/datum/gear/mug/department/med
|
||||
display_name = "doctor coffee mug"
|
||||
description = "A doctor's coffee mug, emblazoned in the colors of the Medical department."
|
||||
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Coroner")
|
||||
path = /obj/item/weapon/reagent_containers/food/drinks/mug/med
|
||||
|
||||
/datum/gear/mug/department/sci
|
||||
display_name = "scientist coffee mug"
|
||||
description = "A scientist's coffee mug, emblazoned in the colors of the Science department."
|
||||
allowed_roles = list("Research Director", "Scientist", "Roboticist")
|
||||
path = /obj/item/weapon/reagent_containers/food/drinks/mug/sci
|
||||
|
||||
/datum/gear/mug/department/sec
|
||||
display_name = "officer coffee mug"
|
||||
description = "An officer's coffee mug, emblazoned in the colors of the Security department."
|
||||
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot", "Brig Physician", "Internal Affairs Agent")
|
||||
path = /obj/item/weapon/reagent_containers/food/drinks/mug/sec
|
||||
|
||||
/datum/gear/mug/department/serv
|
||||
display_name = "crewmember coffee mug"
|
||||
description = "A crewmember's coffee mug, emblazoned in the colors of the Service department."
|
||||
path = /obj/item/weapon/reagent_containers/food/drinks/mug/serv
|
||||
|
||||
@@ -152,7 +152,3 @@
|
||||
/datum/gear/hat/flowerpin
|
||||
display_name = "hair flower"
|
||||
path = /obj/item/clothing/head/hairflower
|
||||
|
||||
/datum/gear/hat/flowerpinpurp
|
||||
display_name = "hair flower, purple"
|
||||
path = /obj/item/clothing/head/hairflower/purple
|
||||
@@ -14,11 +14,6 @@
|
||||
desc = "Smells nice."
|
||||
item_state = "hairflower"
|
||||
|
||||
/obj/item/clothing/head/hairflower/purple
|
||||
icon_state = "hairflowerp"
|
||||
item_state = "hairflowerp"
|
||||
item_state = "that"
|
||||
|
||||
/obj/item/clothing/head/powdered_wig
|
||||
name = "powdered wig"
|
||||
desc = "A powdered wig."
|
||||
|
||||
@@ -131,6 +131,7 @@
|
||||
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
|
||||
icon_state = "clown"
|
||||
item_state = "clown_hat"
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/clothing/mask/gas/sexyclown
|
||||
name = "sexy-clown wig and mask"
|
||||
|
||||
@@ -525,7 +525,7 @@
|
||||
if(!user)
|
||||
return
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, ((src.loc != user) ? ai_interface_path : interface_path), interface_title, 480, 550, state = state)
|
||||
ui.open()
|
||||
|
||||
@@ -99,8 +99,6 @@
|
||||
/obj/item/rig_module/self_destruct
|
||||
)
|
||||
|
||||
..()
|
||||
|
||||
/obj/item/clothing/gloves/rig/light/ninja
|
||||
name = "insulated gloves"
|
||||
siemens_coefficient = 0
|
||||
|
||||
@@ -228,7 +228,7 @@
|
||||
qdel(DL)
|
||||
|
||||
/datum/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, datum/topic_state/state = not_incapacitated_turf_state)
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "personal_crafting.tmpl", "Crafting Menu", 700, 800, state = state)
|
||||
ui.open()
|
||||
@@ -265,14 +265,14 @@
|
||||
if(href_list["make"])
|
||||
var/datum/crafting_recipe/TR = locate(href_list["make"])
|
||||
busy = 1
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
var/fail_msg = construct_item(usr, TR)
|
||||
if(!fail_msg)
|
||||
to_chat(usr, "<span class='notice'>[TR.name] constructed.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class ='warning'>Construction failed[fail_msg]</span>")
|
||||
busy = 0
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
if(href_list["forwardCat"])
|
||||
viewing_category = next_cat()
|
||||
to_chat(usr, "<span class='notice'>Category is now [categories[viewing_category]].</span>")
|
||||
@@ -290,7 +290,7 @@
|
||||
to_chat(usr, "<span class='notice'>Crafting menu is now [display_compact? "compact" : "full size"].</span>")
|
||||
. = TRUE
|
||||
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
|
||||
//Next works nicely with modular arithmetic
|
||||
/datum/personal_crafting/proc/next_cat()
|
||||
|
||||
@@ -276,7 +276,7 @@
|
||||
to_chat(target, "<span class='notice'>You comb your tail with the [src].</span>")
|
||||
used = 1
|
||||
|
||||
/obj/item/device/fluff/desolate_coat_kit //DesolateG: Michael Smith
|
||||
/obj/item/device/fluff/desolate_coat_kit //DesolateG: Micheal Smith
|
||||
name = "armored jacket conversion kit"
|
||||
desc = "Flaps of dark fabric, probably used to somehow modify some sort of an armored garment. Won't help with protection, though."
|
||||
icon_state = "modkit"
|
||||
@@ -335,7 +335,7 @@
|
||||
|
||||
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
|
||||
|
||||
/obj/item/device/fluff/desolate_baton_kit //DesolateG: Michael Smith
|
||||
/obj/item/device/fluff/desolate_baton_kit //DesolateG: Micheal Smith
|
||||
name = "stun baton conversion kit"
|
||||
desc = "Some sci-fi looking parts for a stun baton."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
@@ -588,7 +588,7 @@
|
||||
/obj/item/clothing/head/fluff/heather_winceworth // Regens: Heather Winceworth
|
||||
name= "Heather's rose"
|
||||
desc= "A beautiful purple rose for your hair."
|
||||
icon= 'icons/obj/clothing/hats.dmi'
|
||||
icon= 'icons/obj/custom_items.dmi'
|
||||
icon_state = "hairflowerp"
|
||||
item_state = "hairflowerp"
|
||||
|
||||
@@ -719,15 +719,25 @@
|
||||
/obj/item/clothing/suit/jacket/miljacket/patch/attack_self(mob/user)
|
||||
var/list/options = list()
|
||||
options["purple"] = "shazjacket_purple"
|
||||
options["purple light"] = "shazjacket_purple_light"
|
||||
options["yellow"] = "shazjacket_yellow"
|
||||
options["blue"] = "shazjacket_blue"
|
||||
options["cyan"] = "shazjacket_cyan"
|
||||
options["command blue"] = "shazjacket_command"
|
||||
options["brown"] = "shazjacket_brown"
|
||||
options["orange"] = "shazjacket_orange"
|
||||
options["engi orange"] = "shazjacket_engi"
|
||||
options["grey"] = "shazjacket_grey"
|
||||
options["black"] ="shazjacket_black"
|
||||
options["red"] ="shazjacket_red"
|
||||
options["red light"] ="shazjacket_red_light"
|
||||
options["pink"] ="shazjacket_pink"
|
||||
options["magenta"] ="shazjacket_magenta"
|
||||
options["navy"] ="shazjacket_navy"
|
||||
options["white"] ="shazjacket_white"
|
||||
options["green"] ="shazjacket_green"
|
||||
options["lime"] ="shazjacket_lime"
|
||||
options["army green"] ="shazjacket_army"
|
||||
|
||||
var/choice = input(user, "What color do you wish your jacket to be?", "Change color") as null|anything in options
|
||||
|
||||
@@ -930,6 +940,14 @@
|
||||
flags_inv = HIDEEARS
|
||||
|
||||
//////////// Uniforms ////////////
|
||||
/obj/item/clothing/under/fluff/soviet_casual_uniform // Norstead : Natalya Sokolova
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
name = "Soviet Casual Uniform"
|
||||
desc = "Female U.S.S.P. casual wear. Dlya Rodiny!"
|
||||
icon_state = "soviet_casual_uniform"
|
||||
item_state = "soviet_casual_uniform"
|
||||
item_color = "soviet_casual_uniform"
|
||||
|
||||
/obj/item/clothing/under/fluff/kharshai // Kharshai: Athena Castile
|
||||
name = "Castile formal outfit"
|
||||
desc = "A white and gold formal uniform, accompanied by a small pin with the numbers '004' etched upon it."
|
||||
@@ -1262,3 +1280,37 @@
|
||||
item_state = "victorianvest"
|
||||
item_color = "victorianlightfire"
|
||||
displays_id = FALSE
|
||||
|
||||
|
||||
/obj/item/device/fluff/decemviri_spacepod_kit //Decemviri: Sylus Cain
|
||||
name = "Spacepod mod kit"
|
||||
desc = "a kit on tools and a blueprint detailing how to reconfigure a spacepod"
|
||||
icon_state = "modkit"
|
||||
|
||||
/obj/item/device/fluff/decemviri_spacepod_kit/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity || !ishuman(user) || user.incapacitated())
|
||||
return
|
||||
|
||||
if(!istype(target, /obj/spacepod))
|
||||
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You modify the appearance of [target] based on the kite blueprints.</span>")
|
||||
var/obj/spacepod/pod = target
|
||||
pod.icon = 'icons/48x48/custom_pod.dmi'
|
||||
pod.icon_state = "pod_dece"
|
||||
pod.name = "sleek spacepod"
|
||||
pod.desc = "A modified varient of a space pod."
|
||||
pod.can_paint = FALSE
|
||||
used = 1
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/bikehorn/fluff/pinkbikehorn //Xerdies: Squiddle Toodle
|
||||
name = "Honkinator5000"
|
||||
desc = "This horn may look ridiculous but is the new hot item for clowns in the Clown Empire. It has a fine print on its side reading: Property of Prince Honktertong the IV"
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
|
||||
icon_state = "teri_horn"
|
||||
item_state = "teri_horn"
|
||||
honk_sound = 'sound/items/teri_horn.ogg'
|
||||
@@ -159,7 +159,7 @@
|
||||
spawn(0)
|
||||
|
||||
var/found_something = 0
|
||||
add_log("<B>[worldtime2text()][get_timestamp()] - [target_name]</B>", 0)
|
||||
add_log("<B>[station_time_timestamp()][get_timestamp()] - [target_name]</B>", 0)
|
||||
|
||||
// Fingerprints
|
||||
if(fingerprints && fingerprints.len)
|
||||
|
||||
+13
-13
@@ -50,7 +50,7 @@ log transactions
|
||||
linked_db = null
|
||||
authenticated_account = null
|
||||
visible_message("[bicon(src)]<span class='warning'>[src] buzzes rudely, \"Connection to remote database lost.\"</span>")
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
|
||||
if(ticks_left_timeout > 0)
|
||||
ticks_left_timeout--
|
||||
@@ -90,7 +90,7 @@ log transactions
|
||||
held_card = I
|
||||
if(authenticated_account && held_card.associated_account_number != authenticated_account.account_number)
|
||||
authenticated_account = null
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
else if(authenticated_account)
|
||||
if(istype(I, /obj/item/stack/spacecash))
|
||||
//consume the money
|
||||
@@ -107,11 +107,11 @@ log transactions
|
||||
T.amount = C.amount
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
authenticated_account.transaction_log.Add(T)
|
||||
|
||||
to_chat(user, "<span class='info'>You insert [C] into [src].</span>")
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
C.use(C.amount)
|
||||
else
|
||||
..()
|
||||
@@ -129,7 +129,7 @@ log transactions
|
||||
|
||||
/obj/machinery/atm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
user.set_machine(src)
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "atm.tmpl", name, 550, 650)
|
||||
ui.open()
|
||||
@@ -183,7 +183,7 @@ log transactions
|
||||
T.purpose = transfer_purpose
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
T.amount = "([transfer_amount])"
|
||||
authenticated_account.transaction_log.Add(T)
|
||||
else
|
||||
@@ -225,7 +225,7 @@ log transactions
|
||||
T.purpose = "Unauthorised login attempt"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
failed_account.transaction_log.Add(T)
|
||||
else
|
||||
to_chat(usr, "[bicon(src)]<span class='warning'>Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.</span>")
|
||||
@@ -245,7 +245,7 @@ log transactions
|
||||
T.purpose = "Remote terminal access"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
authenticated_account.transaction_log.Add(T)
|
||||
to_chat(usr, "[bicon(src)]<span class='notice'>Access granted. Welcome user '[authenticated_account.owner_name].'</span>")
|
||||
previous_account_number = tried_account_num
|
||||
@@ -271,7 +271,7 @@ log transactions
|
||||
T.amount = "([amount])"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
authenticated_account.transaction_log.Add(T)
|
||||
else
|
||||
to_chat(usr, "[bicon(src)]<span class='warning'>You don't have enough funds to do that!</span>")
|
||||
@@ -288,7 +288,7 @@ log transactions
|
||||
<i>Account holder:</i> [authenticated_account.owner_name]<br>
|
||||
<i>Account number:</i> [authenticated_account.account_number]<br>
|
||||
<i>Balance:</i> $[authenticated_account.money]<br>
|
||||
<i>Date and time:</i> [worldtime2text()], [current_date_string]<br><br>
|
||||
<i>Date and time:</i> [station_time_timestamp()], [current_date_string]<br><br>
|
||||
<i>Service terminal ID:</i> [machine_id]<br>"}
|
||||
|
||||
//stamp the paper
|
||||
@@ -317,7 +317,7 @@ log transactions
|
||||
if("logout")
|
||||
authenticated_account = null
|
||||
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
return 1
|
||||
|
||||
//create the most effective combination of notes to make up the requested amount
|
||||
@@ -345,8 +345,8 @@ log transactions
|
||||
T.purpose = "Remote terminal access"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
authenticated_account.transaction_log.Add(T)
|
||||
|
||||
view_screen = NO_SCREEN
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
|
||||
@@ -54,8 +54,8 @@ var/global/list/all_money_accounts = list()
|
||||
|
||||
department_accounts[department] = department_account
|
||||
|
||||
//the current ingame time (hh:mm) can be obtained by calling:
|
||||
//worldtime2text()
|
||||
//the current ingame time (hh:mm:ss) can be obtained by calling:
|
||||
//station_time_timestamp("hh:mm:ss")
|
||||
|
||||
/proc/create_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/obj/machinery/computer/account_database/source_db)
|
||||
|
||||
@@ -79,7 +79,7 @@ var/global/list/all_money_accounts = list()
|
||||
M.account_number = rand(111111, 999999)
|
||||
else
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
T.source_terminal = source_db.machine_id
|
||||
|
||||
M.account_number = next_account_number
|
||||
@@ -101,7 +101,7 @@ var/global/list/all_money_accounts = list()
|
||||
<i>Account number:</i> [M.account_number]<br>
|
||||
<i>Account pin:</i> [M.remote_access_pin]<br>
|
||||
<i>Starting balance:</i> $[M.money]<br>
|
||||
<i>Date and time:</i> [worldtime2text()], [current_date_string]<br><br>
|
||||
<i>Date and time:</i> [station_time_timestamp()], [current_date_string]<br><br>
|
||||
<i>Creation terminal ID:</i> [source_db.machine_id]<br>
|
||||
<i>Authorised NT officer overseeing creation:</i> [overseer]<br>"}
|
||||
// END AUTOFIX
|
||||
@@ -302,7 +302,7 @@ var/global/list/all_money_accounts = list()
|
||||
T.purpose = "New account funds initialisation"
|
||||
T.amount = "([starting_funds])"
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
T.source_terminal = machine_id
|
||||
station_account.transaction_log.Add(T)
|
||||
|
||||
@@ -354,7 +354,7 @@ var/global/list/all_money_accounts = list()
|
||||
else
|
||||
T.amount = "[amount]"
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
T.source_terminal = terminal_id
|
||||
D.transaction_log.Add(T)
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
T.purpose = reason
|
||||
T.amount = amount
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
T.source_terminal = machine_id
|
||||
return T
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
O.loc = src
|
||||
held_card = O
|
||||
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
|
||||
attack_hand(user)
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
|
||||
/obj/machinery/computer/account_database/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
user.set_machine(src)
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "accounts_terminal.tmpl", src.name, 400, 640)
|
||||
ui.open()
|
||||
@@ -153,7 +153,7 @@
|
||||
if(!get_access_level(usr))
|
||||
return 1
|
||||
|
||||
var/datum/nanoui/ui = nanomanager.get_open_ui(usr, src, "main")
|
||||
var/datum/nanoui/ui = SSnanoui.get_open_ui(usr, src, "main")
|
||||
|
||||
if(href_list["choice"])
|
||||
switch(href_list["choice"])
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
if(linked_db)
|
||||
if(linked_account)
|
||||
scan_card(O, user)
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
else
|
||||
to_chat(user, "[bicon(src)]<span class='warning'>Unable to connect to linked account.</span>")
|
||||
else
|
||||
@@ -79,7 +79,7 @@
|
||||
..()
|
||||
|
||||
/obj/item/device/eftpos/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "eftpos.tmpl", name, 790, 310)
|
||||
ui.open()
|
||||
@@ -172,7 +172,7 @@
|
||||
access_code = 0
|
||||
to_chat(usr, "[bicon(src)]<span class='info'>Access code reset to 0.</span>")
|
||||
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
return 1
|
||||
|
||||
/obj/item/device/eftpos/proc/scan_card(obj/item/weapon/card/I, mob/user)
|
||||
@@ -203,7 +203,7 @@
|
||||
T.amount = "[transaction_amount]"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
D.transaction_log.Add(T)
|
||||
//
|
||||
T = new()
|
||||
@@ -212,7 +212,7 @@
|
||||
T.amount = "[transaction_amount]"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
linked_account.transaction_log.Add(T)
|
||||
else
|
||||
to_chat(user, "[bicon(src)]<span class='warning'>You don't have that much money!</span>")
|
||||
|
||||
@@ -173,7 +173,7 @@ var/const/POS_HEADER = {"<html>
|
||||
receipt += myArea.name
|
||||
receipt += "</div>"
|
||||
receipt += {"<br />
|
||||
<div>[worldtime2text()], [current_date_string]</div>
|
||||
<div>[station_time_timestamp()], [current_date_string]</div>
|
||||
<table>
|
||||
<tr class=\"first\">
|
||||
<th class=\"first\">Item</th>
|
||||
@@ -369,7 +369,7 @@ var/const/POS_HEADER = {"<html>
|
||||
logindata={"<a href="?src=[UID()];logout=1">[logged_in.name]</a>"}
|
||||
var/dat = POS_HEADER + {"
|
||||
<div class="navbar">
|
||||
[worldtime2text()], [current_date_string]<br />
|
||||
[station_time_timestamp()], [current_date_string]<br />
|
||||
[logindata]
|
||||
<a href="?src=[UID()];screen=[POS_SCREEN_ORDER]">Order</a> |
|
||||
<a href="?src=[UID()];screen=[POS_SCREEN_PRODUCTS]">Products</a> |
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
if(terminal_id)
|
||||
T.source_terminal = terminal_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
dest.transaction_log.Add(T)
|
||||
//
|
||||
T = new()
|
||||
@@ -84,7 +84,7 @@
|
||||
if(terminal_id)
|
||||
T.source_terminal = terminal_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = station_time_timestamp()
|
||||
transaction_log.Add(T)
|
||||
return 1
|
||||
else
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
var/datum/event_meta/EM = E.event_meta
|
||||
EC.available_events += EM
|
||||
|
||||
log_debug("Event '[EM.name]' has completed at [worldtime2text()].")
|
||||
log_debug("Event '[EM.name]' has completed at [station_time_timestamp()].")
|
||||
|
||||
/datum/event_manager/proc/delay_events(var/severity, var/delay)
|
||||
var/list/datum/event_container/EC = event_containers[severity]
|
||||
@@ -78,12 +78,12 @@
|
||||
var/datum/event_meta/EM = E.event_meta
|
||||
if(EM.name == "Nothing")
|
||||
continue
|
||||
var/message = "'[EM.name]' began at [worldtime2text(E.startedAt)] "
|
||||
var/message = "'[EM.name]' began at [station_time_timestamp("hh:mm:ss", E.startedAt)] "
|
||||
if(E.isRunning)
|
||||
message += "and is still running."
|
||||
else
|
||||
if(E.endedAt - E.startedAt > MinutesToTicks(5)) // Only mention end time if the entire duration was more than 5 minutes
|
||||
message += "and ended at [worldtime2text(E.endedAt)]."
|
||||
message += "and ended at [station_time_timestamp("hh:mm:ss", E.endedAt)]."
|
||||
else
|
||||
message += "and ran to completion."
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
var/next_event_at = max(0, EC.next_event_time - world.time)
|
||||
html += "<tr>"
|
||||
html += "<td>[severity_to_string[severity]]</td>"
|
||||
html += "<td>[worldtime2text(max(EC.next_event_time, world.time))]</td>"
|
||||
html += "<td>[station_time_timestamp("hh:mm:ss", max(EC.next_event_time, world.time))]</td>"
|
||||
html += "<td>[round(next_event_at / 600, 0.1)]</td>"
|
||||
html += "<td>"
|
||||
html += "<A align='right' href='?src=[UID()];dec_timer=2;event=\ref[EC]'>--</A>"
|
||||
@@ -188,7 +188,7 @@
|
||||
html += "<tr>"
|
||||
html += "<td>[severity_to_string[EM.severity]]</td>"
|
||||
html += "<td>[EM.name]</td>"
|
||||
html += "<td>[no_end ? "N/A" : worldtime2text(ends_at)]</td>"
|
||||
html += "<td>[no_end ? "N/A" : station_time_timestamp("hh:mm:ss", ends_at)]</td>"
|
||||
html += "<td>[no_end ? "N/A" : ends_in]</td>"
|
||||
html += "<td><A align='right' href='?src=[UID()];stop=\ref[E]'>Stop</A></td>"
|
||||
html += "</tr>"
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
kill()
|
||||
|
||||
/datum/event/money_hacker/announce()
|
||||
var/message = "A brute force hack has been detected (in progress since [worldtime2text()]). The target of the attack is: Financial account #[affected_account.account_number], \
|
||||
var/message = "A brute force hack has been detected (in progress since [station_time_timestamp()]). The target of the attack is: Financial account #[affected_account.account_number], \
|
||||
without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected accounts until the attack has ceased. \
|
||||
Notifications will be sent as updates occur.<br>"
|
||||
var/my_department = "[station_name()] firewall subroutines"
|
||||
@@ -50,7 +50,7 @@
|
||||
T.date = pick("", current_date_string, date1, date2)
|
||||
var/time1 = rand(0, 99999999)
|
||||
var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? add_zero(time1 / 600 % 60, 1) : time1 / 600 % 60]"
|
||||
T.time = pick("", worldtime2text(), time2)
|
||||
T.time = pick("", station_time_timestamp(), time2)
|
||||
T.source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD")
|
||||
|
||||
affected_account.transaction_log.Add(T)
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
if(areas && areas.len > 0)
|
||||
var/my_department = "[station_name()] firewall subroutines"
|
||||
var/rc_message = "An unknown malicious program has been detected in the [english_list(areaName)] lighting and airlock control systems at [worldtime2text()]. Systems will be fully compromised within approximately three minutes. Direct intervention is required immediately.<br>"
|
||||
var/rc_message = "An unknown malicious program has been detected in the [english_list(areaName)] lighting and airlock control systems at [station_time_timestamp()]. Systems will be fully compromised within approximately three minutes. Direct intervention is required immediately.<br>"
|
||||
for(var/obj/machinery/message_server/MS in world)
|
||||
MS.send_rc_message("Engineering", my_department, rc_message, "", "", 2)
|
||||
for(var/mob/living/silicon/ai/A in player_list)
|
||||
|
||||
@@ -319,9 +319,9 @@
|
||||
|
||||
/datum/spacevine_mutation/woodening/on_grow(obj/structure/spacevine/holder)
|
||||
if(holder.energy)
|
||||
holder.density = 1
|
||||
holder.maxhealth = 100
|
||||
holder.health = holder.maxhealth
|
||||
holder.density = TRUE
|
||||
holder.max_integrity = 100
|
||||
holder.obj_integrity = holder.max_integrity
|
||||
|
||||
/datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
|
||||
if(!is_sharp(I))
|
||||
@@ -408,13 +408,12 @@
|
||||
desc = "An extremely expansionistic species of vine."
|
||||
icon = 'icons/effects/spacevines.dmi'
|
||||
icon_state = "Light1"
|
||||
anchored = 1
|
||||
density = 0
|
||||
layer = MOB_LAYER + 0.8
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
layer = SPACEVINE_LAYER
|
||||
mouse_opacity = 2 //Clicking anywhere on the turf is good enough
|
||||
pass_flags = PASSTABLE | PASSGRILLE
|
||||
var/health = 50
|
||||
var/maxhealth = 50
|
||||
max_integrity = 50
|
||||
var/energy = 0
|
||||
var/obj/structure/spacevine_controller/master = null
|
||||
var/list/mutations = list()
|
||||
@@ -481,37 +480,39 @@
|
||||
eater.say("Nom")
|
||||
wither()
|
||||
|
||||
/obj/structure/spacevine/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if (!W || !user || !W.type)
|
||||
return
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
var/damage_to_do = W.force
|
||||
|
||||
if(istype(W, /obj/item/weapon/scythe))
|
||||
var/obj/item/weapon/scythe/S = W
|
||||
/obj/structure/spacevine/attacked_by(obj/item/I, mob/living/user)
|
||||
var/damage_dealt = I.force
|
||||
if(istype(I, /obj/item/weapon/scythe))
|
||||
var/obj/item/weapon/scythe/S = I
|
||||
if(S.extend) //so folded telescythes won't get damage boosts / insta-clears (they instead will instead be treated like non-scythes)
|
||||
damage_to_do *= 4
|
||||
damage_dealt *= 4
|
||||
for(var/obj/structure/spacevine/B in range(1,src))
|
||||
if(B.health > damage_to_do) //this only is going to occur for woodening mutation vines (increased health) or if we nerf scythe damage/multiplier
|
||||
B.health -= damage_to_do
|
||||
if(B.obj_integrity > damage_dealt) //this only is going to occur for woodening mutation vines (increased health) or if we nerf scythe damage/multiplier
|
||||
B.take_damage(damage_dealt, I.damtype, "melee", 1)
|
||||
else
|
||||
B.wither()
|
||||
return
|
||||
|
||||
if(is_sharp(W))
|
||||
damage_to_do *= 4
|
||||
|
||||
if(W && W.damtype == "fire")
|
||||
damage_to_do *= 4
|
||||
if(is_sharp(I))
|
||||
damage_dealt *= 4
|
||||
if(I.damtype == BURN)
|
||||
damage_dealt *= 4
|
||||
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
damage_to_do = SM.on_hit(src, user, W, damage_to_do) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
|
||||
damage_dealt = SM.on_hit(src, user, I, damage_dealt) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
|
||||
take_damage(damage_dealt, I.damtype, "melee", 1)
|
||||
|
||||
health -= damage_to_do
|
||||
if(health < 1)
|
||||
wither()
|
||||
/obj/structure/spacevine/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
if(damage_amount)
|
||||
playsound(src, 'sound/weapons/slash.ogg', 50, 1)
|
||||
else
|
||||
playsound(src, 'sound/weapons/tap.ogg', 50, 1)
|
||||
if(BURN)
|
||||
playsound(src, 'sound/items/welder.ogg', 100, 1)
|
||||
|
||||
..()
|
||||
/obj/structure/spacevine/obj_destruction()
|
||||
wither()
|
||||
|
||||
/obj/structure/spacevine/Crossed(mob/crosser)
|
||||
if(isliving(crosser))
|
||||
|
||||
@@ -49,17 +49,8 @@
|
||||
description_holders["icon"] = "[bicon(A)]"
|
||||
description_holders["desc"] = A.desc
|
||||
|
||||
// Byond seemingly calls stat, each tick.
|
||||
// Calling things each tick can get expensive real quick.
|
||||
// So we slow this down a little.
|
||||
// See: http://www.byond.com/docs/ref/info.html#/client/proc/Stat
|
||||
/client/Stat()
|
||||
. = ..()
|
||||
if(holder)
|
||||
sleep(1)
|
||||
else
|
||||
sleep(5)
|
||||
stoplag()
|
||||
if(usr && statpanel("Examine"))
|
||||
stat(null,"[description_holders["icon"]] <font size='5'>[description_holders["name"]]</font>") //The name, written in big letters.
|
||||
stat(null,"[description_holders["desc"]]") //the default examine text.
|
||||
|
||||
@@ -313,14 +313,17 @@
|
||||
egg_list.Cut() //Destroy any excess eggs, clearing the egg_list
|
||||
|
||||
/obj/machinery/fishtank/proc/harvest_fish(var/mob/user)
|
||||
if(!fish_count) //Can't catch non-existant fish!
|
||||
if(fish_count <= 0) //Can't catch non-existant fish!
|
||||
to_chat(usr, "There are no fish in \the [src] to catch!")
|
||||
return
|
||||
var/list/fish_names_list = list()
|
||||
for(var/datum/fish/fish_type in fish_list)
|
||||
fish_names_list += list("[fish_type.fish_name]" = fish_type)
|
||||
var/caught_fish = input("Select a fish to catch.", "Fishing") as null|anything in fish_names_list //Select a fish from the tank
|
||||
if(caught_fish)
|
||||
if(fish_count <= 0)
|
||||
to_chat(usr, "There are no fish in \the [src] to catch!")
|
||||
return
|
||||
else if(caught_fish)
|
||||
user.visible_message("[user.name] harvests \a [caught_fish] from \the [src].", "You scoop \a [caught_fish] out of \the [src].")
|
||||
var/datum/fish/fish_type = fish_names_list[caught_fish]
|
||||
var/fish_item = fish_type.fish_item
|
||||
@@ -595,7 +598,7 @@
|
||||
playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
check_health()
|
||||
|
||||
/obj/machinery/fishtank/proc/attack_generic(mob/living/user as mob, damage = 0) //used by attack_alien, attack_animal, and attack_slime
|
||||
/obj/machinery/fishtank/attack_generic(mob/living/user, damage = 0) //used by attack_alien, attack_animal, and attack_slime
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
cur_health -= damage
|
||||
|
||||
@@ -1,35 +1,57 @@
|
||||
mob/living/carbon/proc/dream()
|
||||
dreaming = 1
|
||||
var/list/dreams = list(
|
||||
"an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the captain",
|
||||
"voices from all around","deep space","a doctor","the engine","a traitor","an ally","darkness",
|
||||
"light","a scientist","a monkey","a catastrophe","a loved one","a gun","warmth","freezing","the sun",
|
||||
"a hat","the Cyberiad","a ruined station","a planet","plasma","air","the medical bay","the bridge","blinking lights",
|
||||
"a blue light","an abandoned laboratory","Nanotrasen","The Syndicate","blood","healing","power","respect",
|
||||
"riches","space","a crash","happiness","pride","a fall","water","flames","ice","melons","flying","the eggs","money",
|
||||
"the head of personnel","the head of security","a chief engineer","a research director","a chief medical officer",
|
||||
"the detective","the warden","a member of the internal affairs","a station engineer","the janitor","atmospheric technician",
|
||||
"the quartermaster","a cargo technician","the botanist","a shaft miner","the psychologist","the chemist","the geneticist",
|
||||
"the virologist","the roboticist","the chef","the bartender","the chaplain","the librarian", "the brig physician", "the pod pilot",
|
||||
"the barber", "the mechanic", "the magistrate", "the nanotrasen representative", "the blueshield", "a mouse","an ert member",
|
||||
"a beach","the holodeck","a smokey room","a voice","the cold","a mouse","an operating table","the bar","the rain","a skrell",
|
||||
"a unathi","a tajaran", "a vulpkanin", "a slime", "an ipc", "a vox", "a plasmaman", "a grey", "a kidan", "a diona", "the ai core",
|
||||
"the mining station","the research station", "a beaker of strange liquid"
|
||||
)
|
||||
spawn(0)
|
||||
for(var/i = rand(1,4),i > 0, i--)
|
||||
var/dream_image = pick(dreams)
|
||||
dreams -= dream_image
|
||||
to_chat(src, "<span class='notice'><i>... [dream_image] ...</i></span>")
|
||||
sleep(rand(40,70))
|
||||
if(paralysis <= 0)
|
||||
dreaming = 0
|
||||
return 0
|
||||
dreaming = 0
|
||||
return 1
|
||||
///DREAMS
|
||||
|
||||
|
||||
/mob/living/carbon/proc/dream()
|
||||
var/list/dreams = custom_dreams(dream_strings, src)
|
||||
|
||||
for(var/obj/item/weapon/bedsheet/sheet in loc)
|
||||
dreams += sheet.dream_messages
|
||||
var/list/dream_images = list()
|
||||
for(var/i in 1 to rand(3, rand(5, 10)))
|
||||
dream_images += pick_n_take(dreams)
|
||||
dreaming++
|
||||
for(var/i in 1 to dream_images.len)
|
||||
addtimer(src, "experience_dream", ((i - 1) * rand(30,60)), FALSE, dream_images[i], FALSE)
|
||||
return TRUE
|
||||
|
||||
|
||||
/mob/living/carbon/proc/custom_dreams(list/dreamlist, mob/user)
|
||||
var/list/newlist = dreamlist.Copy()
|
||||
for(var/i in 1 to newlist.len)
|
||||
newlist[i] = replacetext(newlist[i], "\[DREAMER\]", "[user.name]")
|
||||
return dreamlist
|
||||
|
||||
|
||||
//NIGHTMARES
|
||||
/mob/living/carbon/proc/nightmare()
|
||||
var/list/nightmares = nightmare_strings.Copy()
|
||||
|
||||
for(var/obj/item/weapon/bedsheet/sheet in loc)
|
||||
nightmares += sheet.nightmare_messages
|
||||
var/list/dream_images = list()
|
||||
for(var/i in 1 to rand(3, rand(5, 10)))
|
||||
dream_images += pick_n_take(nightmares)
|
||||
nightmare++
|
||||
for(var/i in 1 to dream_images.len)
|
||||
addtimer(src, "experience_dream", ((i - 1) * rand(30,60)), FALSE, nightmares[i], TRUE)
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/proc/handle_dreams()
|
||||
if(client && !dreaming && prob(5))
|
||||
dream()
|
||||
else if(client && !nightmare && prob(2))
|
||||
nightmare()
|
||||
if(ishuman(src))
|
||||
if(prob(10))
|
||||
emote("writhes in their sleep.")
|
||||
dir = pick(cardinal)
|
||||
|
||||
/mob/living/carbon/proc/experience_dream(dream_image, isNightmare)
|
||||
dreaming--
|
||||
nightmare--
|
||||
if(stat != UNCONSCIOUS || InCritical())
|
||||
return
|
||||
if(isNightmare)
|
||||
dream_image = "<span class='cultitalic'>[dream_image]</span>"
|
||||
to_chat(src, "<span class='notice'><i>... [dream_image] ...</i></span>")
|
||||
|
||||
/mob/living/carbon/var/dreaming = 0
|
||||
|
||||
@@ -353,3 +353,16 @@
|
||||
icon = 'icons/obj/lavaland/ash_flora.dmi'
|
||||
icon_state = "mushroom_bowl"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bag
|
||||
name = "Drink bag"
|
||||
desc = "Normally put in wine boxes, or down pants at stadium events."
|
||||
icon_state = "goonbag"
|
||||
volume = 70
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bag/goonbag
|
||||
name = "Goon from a Blue Toolbox special edition"
|
||||
desc = "Wine from the land down under, where the dingos roam and the roos do wander."
|
||||
icon_state = "goonbag"
|
||||
list_reagents = list("wine" = 70)
|
||||
@@ -0,0 +1,166 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug
|
||||
name = "coffee mug"
|
||||
desc = "A mug for sipping hot beverages out of."
|
||||
icon = 'icons/obj/mugs.dmi'
|
||||
icon_state = "mug"
|
||||
var/novelty = FALSE
|
||||
var/preset = FALSE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug/novelty
|
||||
name = "novelty coffee mug"
|
||||
desc = "A fun mug for your coffee or other hot beverage!"
|
||||
novelty = TRUE
|
||||
|
||||
/datum/novelty_mug
|
||||
var/name = "novelty coffee mug"
|
||||
var/description = "A fun mug for your coffee or other hot beverage!"
|
||||
var/state = "mug"
|
||||
|
||||
/datum/novelty_mug/peace
|
||||
name = "peaceful mug"
|
||||
description = "It's like... so peaceful, man."
|
||||
state = "mug_peace"
|
||||
|
||||
/datum/novelty_mug/fire
|
||||
name = "fire mug"
|
||||
description = "Caution: contents and design may be incredibly hot."
|
||||
state = "mug_fire"
|
||||
|
||||
/datum/novelty_mug/best
|
||||
name = "best mug"
|
||||
description = "By decree of this mug, you are the best!"
|
||||
state = "mug_best"
|
||||
|
||||
/datum/novelty_mug/best/New()
|
||||
var/locale = pick("Room's", "Department's", "Station's", "World's", "Sector's", "System's", "Galaxy's", "Universe's", "Multi-verse's", "Nanotrasen's", "Syndicate's")
|
||||
var/what = pick("Crewmember", "Spessman", "Employee", "Coffee", "Coffee-drinker", "Survivor", "Personality", "Lifeform", "Doctor", "Scientist", "Engineer", "Officer", "Civillian", "Captain", "Agent")
|
||||
name = "\"[locale] Best [what]\" mug"
|
||||
|
||||
/datum/novelty_mug/worst
|
||||
name = "worst mug"
|
||||
description = "By decree of this mug, you are the worst!"
|
||||
state = "mug_worst"
|
||||
|
||||
/datum/novelty_mug/worst/New()
|
||||
var/locale = pick("Room's", "Department's", "Station's", "World's", "Sector's", "System's", "Galaxy's", "Universe's", "Multi-verse's", "Nanotrasen's", "Syndicate's")
|
||||
var/what = pick("Crewmember", "Spessman", "Employee", "Coffee", "Coffee-drinker", "Survivor", "Personality", "Lifeform", "Doctor", "Scientist", "Engineer", "Officer", "Civillian", "Captain", "Agent")
|
||||
name = "\"[locale] Worst [what]\" mug"
|
||||
|
||||
/datum/novelty_mug/insult
|
||||
name = "insulting coffee mug"
|
||||
description = "How rude!"
|
||||
state = "mug_insult"
|
||||
|
||||
/datum/novelty_mug/insult/New()
|
||||
var/insult = pick("There isn't enough coffee to make you tolerable.", "I drink coffee so I can pretend to like people.", "I haven't had my coffee yet... What's your excuse?", "This coffee is more robust than you.", "Decaf is for weaklings like you.")
|
||||
description = "This one says:\"[insult]\""
|
||||
|
||||
/datum/novelty_mug/pda
|
||||
name = "PDA mug"
|
||||
description = "Finally, a use for one of these!"
|
||||
state = "mug_pda"
|
||||
|
||||
/datum/novelty_mug/rad
|
||||
name = "radioactive mug"
|
||||
description = "Is coffee supposed to be green... and glowing?"
|
||||
state = "mug_rad"
|
||||
|
||||
/datum/novelty_mug/tide
|
||||
name = "greytide mug"
|
||||
description = "This coffee packs almost as much of a punch as a toolbox to the face!"
|
||||
state = "mug_tide"
|
||||
|
||||
/datum/novelty_mug/happy
|
||||
name = "happy mug"
|
||||
description = "Even when you aren't, this mug helps you look happy around coworkers."
|
||||
state = "mug_happy"
|
||||
|
||||
/datum/novelty_mug/pills
|
||||
name = "prescription mug"
|
||||
description = "Prescription: caffeine. Dosage: As much as it takes."
|
||||
state = "mug_pill"
|
||||
|
||||
/datum/novelty_mug/rainbow
|
||||
name = "rainbow mug"
|
||||
description = "So mesmerizing!"
|
||||
state = "mug_rainbow"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug/New()
|
||||
..()
|
||||
if(preset)
|
||||
return
|
||||
if(novelty)
|
||||
var/novelty_type = pick(subtypesof(/datum/novelty_mug))
|
||||
var/datum/novelty_mug/selected = new novelty_type
|
||||
name = selected.name
|
||||
desc = selected.description
|
||||
icon_state = selected.state
|
||||
else
|
||||
icon_state = pick("mug_black", "mug_white", "mug_red", "mug_blue", "mug_green", "mug_pink")
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug/eng
|
||||
name = "engineer's mug"
|
||||
desc = "A mug engineered to hold your beverage... IN SPACE!"
|
||||
icon_state = "mug_eng"
|
||||
preset = TRUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug/med
|
||||
name = "doctor's mug"
|
||||
desc = "A mug that can hold the cure for what ails you!"
|
||||
icon_state = "mug_med"
|
||||
preset = TRUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug/sci
|
||||
name = "scientist's mug"
|
||||
desc = "Nothing fuels research like a coffee mug... or grant money!"
|
||||
icon_state = "mug_sci"
|
||||
preset = TRUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug/sec
|
||||
name = "officer's mug"
|
||||
desc = "The perfect partner for a sprinkled donut or stunbaton!"
|
||||
icon_state = "mug_sec"
|
||||
preset = TRUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug/serv
|
||||
name = "crewmember's mug"
|
||||
desc = "Serve your thirst better than you serve the rest of the crew!"
|
||||
icon_state = "mug_serv"
|
||||
preset = TRUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug/ce
|
||||
name = "chief engineer's mug"
|
||||
desc = "Broken and welded back together countless times, just like the station! Probably microwave safe."
|
||||
icon_state = "mug_ce"
|
||||
preset = TRUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug/hos
|
||||
name = "head of security's mug"
|
||||
desc = "If only your officers were as robust as this coffee's flavor!"
|
||||
icon_state = "mug_hos"
|
||||
preset = TRUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug/rd
|
||||
name = "research director's mug"
|
||||
desc = "Energy tech level: 99"
|
||||
icon_state = "mug_rd"
|
||||
preset = TRUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug/cmo
|
||||
name = "chief medical officer's mug"
|
||||
desc = "Fill it with something to keep you awake while you try to keep the crew alive."
|
||||
icon_state = "mug_cmo"
|
||||
preset = TRUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug/hop
|
||||
name = "head of personnel's mug"
|
||||
desc = "Are the stains on the bottom coffee or ink?"
|
||||
icon_state = "mug_hop"
|
||||
preset = TRUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/mug/cap
|
||||
name = "captain's mug"
|
||||
desc = "An inscription on the side reads \"Best Captain 2559\"... The last time the station had a worthy captain."
|
||||
icon_state = "mug_cap"
|
||||
preset = TRUE
|
||||
@@ -1,3 +1,4 @@
|
||||
#define MAX_WEIGHT_CLASS WEIGHT_CLASS_SMALL
|
||||
//Food items that are eaten normally and don't leave anything behind.
|
||||
/obj/item/weapon/reagent_containers/food/snacks
|
||||
name = "snack"
|
||||
@@ -14,6 +15,7 @@
|
||||
var/dry = 0
|
||||
var/cooktype[0]
|
||||
var/cooked_type = null //for microwave cooking. path of the resulting item after microwaving
|
||||
var/total_w_class = 0 //for the total weight an item of food can carry
|
||||
|
||||
|
||||
//Placeholder for effect that trigger on eating that aren't tied to reagents.
|
||||
@@ -131,6 +133,11 @@
|
||||
)
|
||||
inaccurate = 1
|
||||
else if(W.w_class <= WEIGHT_CLASS_SMALL && istype(src,/obj/item/weapon/reagent_containers/food/snacks/sliceable))
|
||||
var/newweight = GetTotalContentsWeight() + W.GetTotalContentsWeight() + W.w_class
|
||||
if(newweight > MAX_WEIGHT_CLASS)
|
||||
// Nope, no bluespace slice food
|
||||
to_chat(user, "<span class='warning'>You cannot fit [W] in [src]!</span>")
|
||||
return 1
|
||||
if(!iscarbon(user))
|
||||
return 1
|
||||
to_chat(user, "<span class='warning'>You slip [W] inside [src].</span>")
|
||||
@@ -138,6 +145,7 @@
|
||||
if((user.client && user.s_active != src))
|
||||
user.client.screen -= W
|
||||
W.dropped(user)
|
||||
total_w_class += W.w_class
|
||||
add_fingerprint(user)
|
||||
contents += W
|
||||
return
|
||||
@@ -2521,4 +2529,5 @@
|
||||
icon_state = "onionrings"
|
||||
list_reagents = list("nutriment" = 3)
|
||||
filling_color = "#C0C9A0"
|
||||
gender = PLURAL
|
||||
gender = PLURAL
|
||||
#undef MAX_WEIGHT_CLASS
|
||||
@@ -133,7 +133,7 @@
|
||||
item_quants[I.name]++
|
||||
else
|
||||
item_quants[I.name] = 1
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
amount--
|
||||
|
||||
/obj/machinery/smartfridge/chemistry/accept_check(obj/item/O)
|
||||
@@ -227,7 +227,7 @@
|
||||
if(load(O, user))
|
||||
user.visible_message("<span class='notice'>[user] has added \the [O] to \the [src].</span>", "<span class='notice'>You add \the [O] to \the [src].</span>")
|
||||
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
|
||||
else if(istype(O, /obj/item/weapon/storage/bag))
|
||||
var/obj/item/weapon/storage/bag/P = O
|
||||
@@ -240,7 +240,7 @@
|
||||
if(P.contents.len > 0)
|
||||
to_chat(user, "<span class='notice'>Some items are refused.</span>")
|
||||
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
|
||||
else
|
||||
to_chat(user, "<span class='notice'>\The [src] smartly refuses [O].</span>")
|
||||
@@ -306,7 +306,7 @@
|
||||
"<span class='notice'>You empty \the [P] into \the [src].</span>")
|
||||
if(P.contents.len > 0)
|
||||
to_chat(user, "<span class='notice'>Some items are refused.</span>")
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
|
||||
/obj/machinery/smartfridge/secure/emag_act(mob/user)
|
||||
emagged = 1
|
||||
@@ -320,7 +320,7 @@
|
||||
/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
|
||||
user.set_machine(src)
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "smartfridge.tmpl", name, 400, 500)
|
||||
ui.open()
|
||||
@@ -352,7 +352,7 @@
|
||||
if(..()) return 0
|
||||
|
||||
var/mob/user = usr
|
||||
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main")
|
||||
var/datum/nanoui/ui = SSnanoui.get_open_ui(user, src, "main")
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
@@ -521,14 +521,14 @@
|
||||
new dried(loc)
|
||||
item_quants[S.name]--
|
||||
qdel(S)
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
return TRUE
|
||||
for(var/obj/item/stack/sheet/wetleather/WL in contents)
|
||||
var/obj/item/stack/sheet/leather/L = new(loc)
|
||||
L.amount = WL.amount
|
||||
item_quants[WL.name]--
|
||||
qdel(WL)
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -546,6 +546,6 @@
|
||||
if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf)))
|
||||
if(!allowed(usr) && !emagged && locked != -1 && href_list["vend"])
|
||||
to_chat(usr, "<span class='warning'>Access denied.</span>")
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
return 0
|
||||
return ..()
|
||||
@@ -119,6 +119,7 @@
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharp = 1
|
||||
var/extend = 1
|
||||
var/swiping = FALSE
|
||||
|
||||
/obj/item/weapon/scythe/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is beheading \himself with the [src.name]! It looks like \he's trying to commit suicide.</span>")
|
||||
@@ -130,6 +131,21 @@
|
||||
playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'), 50, 1, -1)
|
||||
return (BRUTELOSS)
|
||||
|
||||
/obj/item/weapon/scythe/pre_attackby(atom/A, mob/living/user, params)
|
||||
if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user))
|
||||
return ..()
|
||||
else
|
||||
var/turf/user_turf = get_turf(user)
|
||||
var/dir_to_target = get_dir(user_turf, get_turf(A))
|
||||
swiping = TRUE
|
||||
var/static/list/scythe_slash_angles = list(0, 45, 90, -45, -90)
|
||||
for(var/i in scythe_slash_angles)
|
||||
var/turf/T = get_step(user_turf, turn(dir_to_target, i))
|
||||
for(var/obj/structure/spacevine/V in T)
|
||||
if(user.Adjacent(V))
|
||||
melee_attack_chain(user, V)
|
||||
swiping = FALSE
|
||||
|
||||
/obj/item/weapon/scythe/tele
|
||||
icon_state = "tscythe0"
|
||||
item_state = null //no sprite for folded version, like a tele-baton
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
stack_list[processed_sheet] = s
|
||||
// Not including tg's ignoring of metal, glass being stocked because if cargo's not telling science when ores are there, they probably won't
|
||||
// help with restocking metal/glass either
|
||||
var/msg = "\[[worldtime2text()]\]: [capitalize(s.name)] sheets have been stocked in the ore reclaimer."
|
||||
var/msg = "\[[station_time_timestamp()]\]: [capitalize(s.name)] sheets have been stocked in the ore reclaimer."
|
||||
for(var/obj/machinery/requests_console/D in allConsoles)
|
||||
if(D.department in src.supply_consoles)
|
||||
if(supply_consoles[D.department] == null || (s.name in supply_consoles[D.department]))
|
||||
|
||||
@@ -335,6 +335,7 @@
|
||||
friendly = "mends"
|
||||
density = 0
|
||||
flying = 1
|
||||
obj_damage = 0
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
ventcrawler = 2
|
||||
mob_size = MOB_SIZE_TINY
|
||||
|
||||
@@ -418,7 +418,7 @@ var/global/list/rockTurfEdgeCache = list(
|
||||
return
|
||||
|
||||
/turf/simulated/mineral/attack_animal(mob/living/simple_animal/user as mob)
|
||||
if(user.environment_smash >= 2)
|
||||
if((user.environment_smash & ENVIRONMENT_SMASH_WALLS) || (user.environment_smash & ENVIRONMENT_SMASH_RWALLS))
|
||||
gets_drilled()
|
||||
..()
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
maxHealth = 125
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
obj_damage = 0
|
||||
environment_smash = 0
|
||||
check_friendly_fire = 1
|
||||
stop_automated_movement_when_pulled = 1
|
||||
|
||||
@@ -562,7 +562,7 @@
|
||||
|
||||
log_robot("[key_name(speaker)] : [message]")
|
||||
var/message_start = "<i><span class='game say'>[name], <span class='name'>[speaker.name]</span>"
|
||||
var/message_body = "<span class='message'>[speaker.say_quote(message)],</i> <span class='ibm'>\"[message]\"</span></span></span>"
|
||||
var/message_body = "<span class='message'>[speaker.say_quote(message)],</i><span class='robot'>\"[message]\"</span></span></span>"
|
||||
|
||||
for(var/mob/M in dead_mob_list)
|
||||
if(!isnewplayer(M) && !isbrain(M))
|
||||
@@ -618,7 +618,7 @@
|
||||
exclaim_verb = "tones"
|
||||
colour = "say_quote"
|
||||
key = "z"//Zwarmer...Or Zerg!
|
||||
flags = RESTRICTED || HIVEMIND
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
follow = 1
|
||||
|
||||
// Language handling.
|
||||
|
||||
@@ -55,6 +55,6 @@
|
||||
update_icons()
|
||||
|
||||
timeofdeath = world.time
|
||||
if(mind) mind.store_memory("Time of death: [worldtime2text(timeofdeath)]", 0)
|
||||
if(mind) mind.store_memory("Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]", 0)
|
||||
|
||||
return ..(gibbed)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
update_canmove()
|
||||
|
||||
timeofdeath = world.time
|
||||
if(mind) mind.store_memory("Time of death: [worldtime2text(timeofdeath)]", 0)
|
||||
if(mind) mind.store_memory("Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]", 0)
|
||||
living_mob_list -= src
|
||||
|
||||
return ..(gibbed)
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
|
||||
timeofdeath = world.time
|
||||
if(mind) mind.store_memory("Time of death: [worldtime2text(timeofdeath)]", 0) //mind. ?
|
||||
if(mind) mind.store_memory("Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]", 0) //mind. ?
|
||||
|
||||
return ..(gibbed)
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
for(var/datum/surgery/S in surgeries)
|
||||
if(S.next_step(user, src))
|
||||
return 1
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/attack_hand(mob/living/carbon/human/user)
|
||||
if(!iscarbon(user))
|
||||
|
||||
@@ -24,5 +24,7 @@
|
||||
|
||||
var/failed_last_breath = FALSE //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
|
||||
var/co2overloadtime = null
|
||||
var/dreaming = 0 //How many dream images we have left to send
|
||||
var/nightmare = 0
|
||||
|
||||
blood_volume = BLOOD_VOLUME_NORMAL
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
timeofdeath = world.time
|
||||
med_hud_set_health()
|
||||
med_hud_set_status()
|
||||
if(mind) mind.store_memory("Time of death: [worldtime2text(timeofdeath)]", 0)
|
||||
if(mind) mind.store_memory("Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]", 0)
|
||||
if(ticker && ticker.mode)
|
||||
// log_to_dd("k")
|
||||
sql_report_death(src)
|
||||
|
||||
@@ -835,13 +835,13 @@
|
||||
else
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/U = usr
|
||||
R.fields["comments"] += "Set to [setcriminal] by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [worldtime2text()] with comment: [t1]<BR>"
|
||||
R.fields["comments"] += "Set to [setcriminal] by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [station_time_timestamp()] with comment: [t1]<BR>"
|
||||
if(isrobot(usr))
|
||||
var/mob/living/silicon/robot/U = usr
|
||||
R.fields["comments"] += "Set to [setcriminal] by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [worldtime2text()] with comment: [t1]<BR>"
|
||||
R.fields["comments"] += "Set to [setcriminal] by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [station_time_timestamp()] with comment: [t1]<BR>"
|
||||
if(isAI(usr))
|
||||
var/mob/living/silicon/ai/U = usr
|
||||
R.fields["comments"] += "Set to [setcriminal] by [U.name] (artificial intelligence) on [current_date_string] [worldtime2text()] with comment: [t1]<BR>"
|
||||
R.fields["comments"] += "Set to [setcriminal] by [U.name] (artificial intelligence) on [current_date_string] [station_time_timestamp()] with comment: [t1]<BR>"
|
||||
|
||||
R.fields["criminal"] = setcriminal
|
||||
log_admin("[key_name_admin(usr)] set secstatus of [their_rank] [their_name] to [setcriminal], comment: [t1]")
|
||||
@@ -931,13 +931,13 @@
|
||||
return
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/U = usr
|
||||
R.fields["comments"] += "Made by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [worldtime2text()]<BR>[t1]"
|
||||
R.fields["comments"] += "Made by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [station_time_timestamp()]<BR>[t1]"
|
||||
if(isrobot(usr))
|
||||
var/mob/living/silicon/robot/U = usr
|
||||
R.fields["comments"] += "Made by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [worldtime2text()]<BR>[t1]"
|
||||
R.fields["comments"] += "Made by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [station_time_timestamp()]<BR>[t1]"
|
||||
if(isAI(usr))
|
||||
var/mob/living/silicon/ai/U = usr
|
||||
R.fields["comments"] += "Made by [U.name] (artificial intelligence) on [current_date_string] [worldtime2text()]<BR>[t1]"
|
||||
R.fields["comments"] += "Made by [U.name] (artificial intelligence) on [current_date_string] [station_time_timestamp()]<BR>[t1]"
|
||||
|
||||
if(href_list["medical"])
|
||||
if(hasHUD(usr,"medical"))
|
||||
@@ -1053,10 +1053,10 @@
|
||||
return
|
||||
if(ishuman(usr))
|
||||
var/mob/living/carbon/human/U = usr
|
||||
R.fields["comments"] += "Made by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [worldtime2text()]<BR>[t1]"
|
||||
R.fields["comments"] += "Made by [U.get_authentification_name()] ([U.get_assignment()]) on [current_date_string] [station_time_timestamp()]<BR>[t1]"
|
||||
if(isrobot(usr))
|
||||
var/mob/living/silicon/robot/U = usr
|
||||
R.fields["comments"] += "Made by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [worldtime2text()]<BR>[t1]"
|
||||
R.fields["comments"] += "Made by [U.name] ([U.modtype] [U.braintype]) on [current_date_string] [station_time_timestamp()]<BR>[t1]"
|
||||
|
||||
if(href_list["lookitem"])
|
||||
var/obj/item/I = locate(href_list["lookitem"])
|
||||
@@ -1668,6 +1668,41 @@
|
||||
G.icon_state = "grabbed1"
|
||||
G.synch()
|
||||
|
||||
/mob/living/carbon/human/proc/get_eyecon()
|
||||
var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes)
|
||||
var/obj/item/organ/internal/cyberimp/eyes/eye_implant = get_int_organ(/obj/item/organ/internal/cyberimp/eyes)
|
||||
if(istype(species) && species.eyes)
|
||||
var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', species.eyes)
|
||||
if(eye_implant) //Eye implants override native DNA eye colo(u)r
|
||||
eyes_icon = eye_implant.generate_icon()
|
||||
else if(eyes)
|
||||
eyes_icon = eyes.generate_icon()
|
||||
else
|
||||
eyes_icon.Blend("#800000", ICON_ADD)
|
||||
|
||||
return eyes_icon
|
||||
|
||||
/mob/living/carbon/human/proc/get_eye_shine() //Referenced cult constructs for shining in the dark. Needs to be above lighting effects such as shading.
|
||||
var/obj/item/organ/external/head/head_organ = get_organ("head")
|
||||
var/datum/sprite_accessory/hair/hair_style = hair_styles_full_list[head_organ.h_style]
|
||||
var/icon/hair = new /icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
|
||||
|
||||
return image(get_icon_difference(get_eyecon(), hair), layer = LIGHTING_LAYER + 1) //Cut the hair's pixels from the eyes icon so eyes covered by bangs stay hidden even while on a higher layer.
|
||||
|
||||
/*Used to check if eyes should shine in the dark. Returns the image of the eyes on the layer where they will appear to shine.
|
||||
Eyes need to have significantly high darksight to shine unless the mob has the XRAY vision mutation. Eyes will not shine if they are covered in any way.*/
|
||||
/mob/living/carbon/human/proc/eyes_shine()
|
||||
var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes)
|
||||
var/obj/item/organ/internal/cyberimp/eyes/eye_implant = get_int_organ(/obj/item/organ/internal/cyberimp/eyes)
|
||||
if(!(istype(eyes) || istype(eye_implant)))
|
||||
return FALSE
|
||||
if(!get_location_accessible(src, "eyes"))
|
||||
return FALSE
|
||||
if(!(eyes.shine()) && !istype(eye_implant) && !(XRAY in mutations)) //If their eyes don't shine, they don't have other augs, nor do they have X-RAY vision
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/human/proc/gut()
|
||||
set category = "Abilities"
|
||||
set name = "Gut"
|
||||
|
||||
@@ -228,6 +228,3 @@
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] attempted to disarm [src]!</span>")
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params)
|
||||
return
|
||||
|
||||
@@ -176,21 +176,22 @@ emp_act
|
||||
return 1
|
||||
|
||||
//Returns 1 if the attack hit, 0 if it missed.
|
||||
/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
|
||||
if(!I || !user) return 0
|
||||
/mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user, def_zone)
|
||||
if(!I || !user)
|
||||
return 0
|
||||
|
||||
if((istype(I, /obj/item/weapon/kitchen/knife/butcher/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == INTENT_HARM)
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(src.loc))
|
||||
newmeat.name = src.real_name + newmeat.name
|
||||
newmeat.subjectname = src.real_name
|
||||
newmeat.subjectjob = src.job
|
||||
newmeat.reagents.add_reagent ("nutriment", (src.nutrition / 15) / 3)
|
||||
src.reagents.trans_to (newmeat, round ((src.reagents.total_volume) / 3, 1))
|
||||
if((istype(I, /obj/item/weapon/kitchen/knife/butcher/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && stat == DEAD && user.a_intent == INTENT_HARM)
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(loc))
|
||||
newmeat.name = real_name + newmeat.name
|
||||
newmeat.subjectname = real_name
|
||||
newmeat.subjectjob = job
|
||||
newmeat.reagents.add_reagent("nutriment", (nutrition / 15) / 3)
|
||||
reagents.trans_to(newmeat, round((reagents.total_volume) / 3, 1))
|
||||
add_mob_blood(src)
|
||||
--src.meatleft
|
||||
to_chat(user, "<span class='warning'>You hack off a chunk of meat from [src.name]</span>")
|
||||
if(!src.meatleft)
|
||||
src.create_attack_log("Was chopped up into meat by <b>[key_name(user)]</b>")
|
||||
--meatleft
|
||||
to_chat(user, "<span class='warning'>You hack off a chunk of meat from [name]</span>")
|
||||
if(!meatleft)
|
||||
create_attack_log("Was chopped up into meat by <b>[key_name(user)]</b>")
|
||||
user.create_attack_log("Chopped up <b>[key_name(src)]</b> into meat</b>")
|
||||
msg_admin_attack("[key_name_admin(user)] chopped up [key_name_admin(src)] into meat")
|
||||
if(!iscarbon(user))
|
||||
@@ -214,19 +215,18 @@ emp_act
|
||||
if(istype(I,/obj/item/weapon/card/emag))
|
||||
emag_act(user, affecting)
|
||||
|
||||
if(! I.discrete)
|
||||
if(I.attack_verb.len)
|
||||
visible_message("<span class='combat danger'>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I.name] by [user]!</span>")
|
||||
else
|
||||
visible_message("<span class='combat danger'>[src] has been attacked in the [hit_area] with [I.name] by [user]!</span>")
|
||||
send_item_attack_message(I, user, hit_area)
|
||||
|
||||
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", armour_penetration = I.armour_penetration)
|
||||
if(!I.force)
|
||||
return 0 //item force is zero
|
||||
|
||||
var/armor = run_armor_check(affecting, "melee", "<span class='warning'>Your armour has protected your [hit_area].</span>", "<span class='warning'>Your armour has softened hit to your [hit_area].</span>", armour_penetration = I.armour_penetration)
|
||||
var/weapon_sharp = is_sharp(I)
|
||||
if(weapon_sharp && prob(getarmor(user.zone_sel.selecting, "melee")))
|
||||
weapon_sharp = 0
|
||||
|
||||
if(armor >= 100) return 0
|
||||
if(!I.force) return 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)
|
||||
@@ -234,8 +234,6 @@ emp_act
|
||||
var/bloody = 0
|
||||
if(I.damtype == BRUTE && I.force && prob(25 + I.force * 2))
|
||||
I.add_mob_blood(src) //Make the weapon bloody, not the person.
|
||||
// if(user.hand) user.update_inv_l_hand() //updates the attacker's overlay for the (now bloodied) weapon
|
||||
// else user.update_inv_r_hand() //removed because weapons don't have on-mob blood overlays
|
||||
if(prob(I.force * 2)) //blood spatter!
|
||||
bloody = 1
|
||||
var/turf/location = loc
|
||||
|
||||
@@ -170,9 +170,9 @@ I use this to standardize shadowling dethrall code
|
||||
-- Crazylemon
|
||||
*/
|
||||
/mob/living/carbon/human/proc/named_organ_parent(var/organ_name)
|
||||
if(!get_int_organ(organ_name))
|
||||
if(!get_int_organ_tag(organ_name))
|
||||
return null
|
||||
var/obj/item/organ/internal/O = get_int_organ(organ_name)
|
||||
var/obj/item/organ/internal/O = get_int_organ_tag(organ_name)
|
||||
return O.parent_organ
|
||||
|
||||
/mob/living/carbon/human/has_organic_damage()
|
||||
@@ -187,4 +187,4 @@ I use this to standardize shadowling dethrall code
|
||||
splinted_limbs.Cut()
|
||||
for(var/obj/item/organ/external/limb in bodyparts)
|
||||
if(limb.status & ORGAN_SPLINTED)
|
||||
splinted_limbs += limb
|
||||
splinted_limbs += limb
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
default_headacc = "Simple"
|
||||
default_headacc_colour = "#404040"
|
||||
butt_sprite = "unathi"
|
||||
brute_mod = 1.05
|
||||
|
||||
has_organ = list(
|
||||
"heart" = /obj/item/organ/internal/heart,
|
||||
@@ -78,6 +79,38 @@
|
||||
"is twisting their own neck!",
|
||||
"is holding their breath!")
|
||||
|
||||
var/datum/action/innate/tail_lash/lash = new()
|
||||
|
||||
|
||||
/datum/species/unathi/handle_post_spawn(var/mob/living/carbon/human/H)
|
||||
lash.Grant(H)
|
||||
..()
|
||||
|
||||
/datum/action/innate/tail_lash
|
||||
name = "Tail lash"
|
||||
icon_icon = 'icons/effects/effects.dmi'
|
||||
button_icon_state = "tail"
|
||||
|
||||
/datum/action/innate/tail_lash/Activate()
|
||||
var/mob/living/carbon/human/user = owner
|
||||
if(!user.restrained() || !user.buckled)
|
||||
to_chat(user, "<span class='warning'>You need freedom of movement to tail lash!</span>")
|
||||
return
|
||||
if(user.getStaminaLoss() >= 50)
|
||||
to_chat(user, "<span class='warning'>Rest before tail lashing again!</span>")
|
||||
return
|
||||
for(var/mob/living/carbon/human/C in orange(1))
|
||||
var/obj/item/organ/external/E = C.get_organ(pick("l_leg", "r_leg", "l_foot", "r_foot", "groin"))
|
||||
if(E)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.visible_message("<span class='danger'>[src] smacks [C] in [E] with their tail! </span>", "<span class='danger'>You hit [C] in [E] with your tail!</span>")
|
||||
user.adjustStaminaLoss(15)
|
||||
C.apply_damage(5, BRUTE, E)
|
||||
user.spin(20, 1)
|
||||
playsound(user.loc, 'sound/weapons/slash.ogg', 50, 0)
|
||||
|
||||
|
||||
|
||||
/datum/species/unathi/handle_death(var/mob/living/carbon/human/H)
|
||||
H.stop_tail_wagging(1)
|
||||
|
||||
@@ -163,6 +196,7 @@
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR
|
||||
dietflags = DIET_OMNI
|
||||
hunger_drain = 0.11
|
||||
taste_sensitivity = TASTE_SENSITIVITY_SHARP
|
||||
reagent_tag = PROCESS_ORG
|
||||
flesh_color = "#966464"
|
||||
@@ -551,11 +585,27 @@
|
||||
|
||||
var/list/mob/living/carbon/human/recolor_list = list()
|
||||
|
||||
var/datum/action/innate/regrow/grow = new()
|
||||
|
||||
species_abilities = list(
|
||||
/mob/living/carbon/human/verb/toggle_recolor_verb,
|
||||
/mob/living/carbon/human/proc/regrow_limbs
|
||||
)
|
||||
|
||||
/datum/species/slime/handle_post_spawn(var/mob/living/carbon/human/H)
|
||||
grow.Grant(H)
|
||||
..()
|
||||
|
||||
/datum/action/innate/regrow
|
||||
name = "Regrow limbs"
|
||||
icon_icon = 'icons/effects/effects.dmi'
|
||||
button_icon_state = "greenglow"
|
||||
|
||||
/datum/action/innate/regrow/Activate()
|
||||
var/mob/living/carbon/human/user = owner
|
||||
user.regrow_limbs()
|
||||
|
||||
|
||||
/datum/species/slime/handle_life(var/mob/living/carbon/human/H)
|
||||
//This is allegedly for code "style". Like a plaid sweater?
|
||||
#define SLIMEPERSON_COLOR_SHIFT_TRIGGER 0.1
|
||||
@@ -787,7 +837,8 @@
|
||||
|
||||
species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN)
|
||||
clothing_flags = HAS_SOCKS
|
||||
dietflags = 0 //Diona regenerate nutrition in light, no diet necessary
|
||||
default_hair_colour = "#000000"
|
||||
dietflags = 0 //Diona regenerate nutrition in light and water, no diet necessary
|
||||
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
|
||||
|
||||
oxy_mod = 0
|
||||
@@ -947,6 +998,8 @@
|
||||
|
||||
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
|
||||
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
|
||||
if(!head_organ)
|
||||
return
|
||||
head_organ.h_style = "Bald"
|
||||
head_organ.f_style = "Shaved"
|
||||
spawn(100)
|
||||
|
||||
@@ -105,6 +105,7 @@ Please contact me on #coderbus IRC. ~Carn x
|
||||
|
||||
/mob/living/carbon/human
|
||||
var/list/overlays_standing[TOTAL_LAYERS]
|
||||
var/list/misc_effect_overlays = list() //Overlays that are applied at a custom layer (defined in each image's .layer property) outside of standard overlay application. Updated in update_misc_effects()
|
||||
var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed
|
||||
var/icon/skeleton
|
||||
var/list/cached_standing_overlays = list() // List of everything currently in a human's actual overlays
|
||||
@@ -154,6 +155,10 @@ Please contact me on #coderbus IRC. ~Carn x
|
||||
I.layer = (-2 - (TOTAL_LAYERS - i)) // Highest layer gets -2, each prior layer is 1 lower
|
||||
new_overlays += I
|
||||
|
||||
update_misc_effects()
|
||||
if(misc_effect_overlays)
|
||||
new_overlays += misc_effect_overlays
|
||||
|
||||
if(frozen) // Admin freeze overlay
|
||||
new_overlays += frozen
|
||||
|
||||
@@ -1324,6 +1329,13 @@ var/global/list/damage_icon_parts = list()
|
||||
|
||||
if(update_icons) update_icons()
|
||||
|
||||
/mob/living/carbon/human/proc/update_misc_effects()
|
||||
misc_effect_overlays.Cut()
|
||||
|
||||
//Begin appending miscellaneous effects.
|
||||
if(eyes_shine())
|
||||
misc_effect_overlays += get_eye_shine() //Image layer is specified in get_eye_shine() proc as LIGHTING_LAYER + 1.
|
||||
|
||||
/mob/living/carbon/human/proc/force_update_limbs()
|
||||
for(var/obj/item/organ/external/O in bodyparts)
|
||||
O.sync_colour_to_human(src)
|
||||
|
||||
@@ -353,6 +353,21 @@
|
||||
if(..())
|
||||
handle_dreams()
|
||||
adjustStaminaLoss(-10)
|
||||
var/comfort = 1
|
||||
if(istype(buckled, /obj/structure/stool/bed))
|
||||
var/obj/structure/stool/bed/bed = buckled
|
||||
comfort+= bed.comfort
|
||||
for(var/obj/item/weapon/bedsheet/bedsheet in range(loc,0))
|
||||
if(bedsheet.loc != loc) //bedsheets in your backpack/neck don't give you comfort
|
||||
continue
|
||||
comfort+= bedsheet.comfort
|
||||
break //Only count the first bedsheet
|
||||
if(drunk)
|
||||
comfort += 1 //Aren't naps SO much better when drunk?
|
||||
AdjustDrunk(1-0.0015*comfort) //reduce drunkenness ~6% per two seconds, when on floor.
|
||||
if(comfort > 1 && prob(3))//You don't heal if you're just sleeping on the floor without a blanket.
|
||||
adjustBruteLoss(-1*comfort)
|
||||
adjustFireLoss(-1*comfort)
|
||||
if(prob(10) && health && hal_screwyhud != SCREWYHUD_CRIT)
|
||||
emote("snore")
|
||||
// Keep SSD people asleep
|
||||
|
||||
@@ -193,6 +193,12 @@
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
/mob/living/carbon/slime/MouseDrop(atom/movable/A)
|
||||
if(isliving(A) && A != usr)
|
||||
var/mob/living/Food = A
|
||||
if(Food.Adjacent(usr) && !stat && Food.stat != DEAD) //messy
|
||||
Feedon(Food)
|
||||
..()
|
||||
|
||||
/mob/living/carbon/slime/unEquip(obj/item/W as obj)
|
||||
return
|
||||
@@ -200,28 +206,25 @@
|
||||
/mob/living/carbon/slime/attack_ui(slot)
|
||||
return
|
||||
|
||||
/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob)
|
||||
/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M)
|
||||
if(!ticker)
|
||||
to_chat(M, "You cannot attack people before the game has started.")
|
||||
return
|
||||
|
||||
if(Victim) return // can't attack while eating!
|
||||
if(Victim)
|
||||
return // can't attack while eating!
|
||||
|
||||
M.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[M.name] has glomped [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] has glomped [src]!</span>")
|
||||
var/damage = rand(1, 3)
|
||||
attacked += 5
|
||||
if(M.is_adult)
|
||||
damage = rand(1, 6)
|
||||
else
|
||||
damage = rand(1, 3)
|
||||
if(health > -100)
|
||||
|
||||
M.do_attack_animation(src)
|
||||
visible_message("<span class='danger'> The [M.name] has glomped [src]!</span>", \
|
||||
"<span class='userdanger'> The [M.name] has glomped [src]!</span>")
|
||||
var/damage = rand(1, 3)
|
||||
attacked += 5
|
||||
|
||||
if(M.is_adult)
|
||||
damage = rand(1, 6)
|
||||
else
|
||||
damage = rand(1, 3)
|
||||
|
||||
adjustBruteLoss(damage)
|
||||
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
@@ -327,20 +330,6 @@
|
||||
if(S.next_step(M, src))
|
||||
return 1
|
||||
|
||||
/*
|
||||
if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves))
|
||||
var/obj/item/clothing/gloves/G = M.gloves
|
||||
if(G.cell)
|
||||
if(M.a_intent == "hurt")//Stungloves. Any contact will stun the alien.
|
||||
if(G.cell.charge >= 2500)
|
||||
G.cell.use(2500)
|
||||
visible_message("<span class='warning'>[src] has been touched with the stun gloves by [M]!</span>")
|
||||
return
|
||||
else
|
||||
to_chat(M, "<span class='warning'>Not enough charge! </span>")
|
||||
return
|
||||
*/
|
||||
|
||||
switch(M.a_intent)
|
||||
|
||||
if(INTENT_HELP)
|
||||
@@ -373,9 +362,9 @@
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has punched [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has punched [src]!</span>")
|
||||
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
if(health > -100)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to punch [src]!</span>")
|
||||
@@ -404,13 +393,14 @@
|
||||
var/damage = rand(15, 30)
|
||||
if(damage >= 25)
|
||||
damage = rand(20, 40)
|
||||
visible_message("<span class='danger'>[M] has attacked [name]!</span>", \
|
||||
"<span class='userdanger'>[M] has attacked [name]!</span>")
|
||||
visible_message("<span class='danger'>[M] has slashed [name]!</span>", \
|
||||
"<span class='userdanger'>[M] has slashed [name]!</span>")
|
||||
else
|
||||
visible_message("<span class='danger'>[M] has wounded [name]!</span>", \
|
||||
"<span class='userdanger'>)[M] has wounded [name]!</span>")
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
if(health > -100)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has attempted to lunge at [name]!</span>", \
|
||||
|
||||
@@ -983,11 +983,12 @@
|
||||
return 0
|
||||
|
||||
/mob/living/proc/attempt_harvest(obj/item/I, mob/user)
|
||||
if(stat == DEAD && !isnull(butcher_results)) //can we butcher it?
|
||||
if(istype(I, /obj/item/weapon/kitchen/knife))
|
||||
if(user.a_intent == INTENT_HARM && stat == DEAD && butcher_results) //can we butcher it?
|
||||
var/sharpness = is_sharp(I)
|
||||
if(sharpness)
|
||||
to_chat(user, "<span class='notice'>You begin to butcher [src]...</span>")
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
|
||||
if(do_mob(user, src, 80))
|
||||
if(do_mob(user, src, 80 / sharpness) && Adjacent(I))
|
||||
harvest(user)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -226,6 +226,27 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
job = "AI"
|
||||
|
||||
/mob/living/silicon/ai/Stat()
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
if(stat)
|
||||
stat(null, text("Systems nonfunctional"))
|
||||
return
|
||||
show_borg_info()
|
||||
|
||||
/mob/living/silicon/ai/proc/show_borg_info()
|
||||
stat(null, text("Connected cyborgs: [connected_robots.len]"))
|
||||
for(var/mob/living/silicon/robot/R in connected_robots)
|
||||
var/robot_status = "Nominal"
|
||||
if(R.stat || !R.client)
|
||||
robot_status = "OFFLINE"
|
||||
else if(!R.cell || R.cell.charge <= 0)
|
||||
robot_status = "DEPOWERED"
|
||||
// Name, Health, Battery, Module, Area, and Status! Everything an AI wants to know about its borgies!
|
||||
var/area/A = get_area(R)
|
||||
stat(null, text("[R.name] | S.Integrity: [R.health]% | Cell: [R.cell ? "[R.cell.charge] / [R.cell.maxcharge]" : "Empty"] | \
|
||||
Module: [R.designation] | Loc: [sanitize(A.name)] | Status: [robot_status]"))
|
||||
|
||||
/mob/living/silicon/ai/rename_character(oldname, newname)
|
||||
if(!..(oldname, newname))
|
||||
return FALSE
|
||||
|
||||
@@ -44,6 +44,6 @@
|
||||
loc.icon_state = "aicard-404"
|
||||
|
||||
timeofdeath = world.time
|
||||
if(mind) mind.store_memory("Time of death: [worldtime2text(timeofdeath)]", 0)
|
||||
if(mind) mind.store_memory("Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]", 0)
|
||||
|
||||
return ..(gibbed)
|
||||
|
||||
@@ -295,7 +295,7 @@
|
||||
medicalActive1 = null
|
||||
medicalActive2 = null
|
||||
medical_cannotfind = 0
|
||||
nanomanager.update_uis(src)
|
||||
SSnanoui.update_uis(src)
|
||||
to_chat(usr, "<span class='notice'>You reset your record-viewing software.</span>")
|
||||
|
||||
/mob/living/silicon/pai/cancel_camera()
|
||||
|
||||
@@ -41,7 +41,7 @@ var/global/list/default_pai_software = list()
|
||||
if(ui_key != "main")
|
||||
var/datum/pai_software/S = software[ui_key]
|
||||
if(S && !S.toggle)
|
||||
ui = nanomanager.try_update_ui(user, src, S.id, ui, force_open)
|
||||
ui = SSnanoui.try_update_ui(user, src, S.id, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, S.id, S.template_file, S.ui_title, S.ui_width, S.ui_height, state = state)
|
||||
ui.open()
|
||||
@@ -52,7 +52,7 @@ var/global/list/default_pai_software = list()
|
||||
ui.set_status(STATUS_CLOSE, 0)
|
||||
return
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "pai_interface.tmpl", "pAI Software Interface", 450, 600, state = state)
|
||||
ui.open()
|
||||
@@ -132,4 +132,4 @@ var/global/list/default_pai_software = list()
|
||||
var/img = text2num(href_list["image"])
|
||||
if(1 <= img && img <= 9)
|
||||
card.setEmotion(img)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -206,7 +206,7 @@
|
||||
to_chat(user, "\t Key: <font color='#FFA500'>Electronics</font>/<font color='red'>Brute</font>")
|
||||
to_chat(user, "\t Damage Specifics: <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font>")
|
||||
if(M.timeofdeath && M.stat == DEAD)
|
||||
to_chat(user, "<span class='notice'>Time of Disable: [worldtime2text(M.timeofdeath)]</span>")
|
||||
to_chat(user, "<span class='notice'>Time of Disable: [station_time_timestamp("hh:mm:ss", M.timeofdeath)]</span>")
|
||||
var/mob/living/silicon/robot/H = M
|
||||
var/list/damaged = H.get_damaged_components(1,1,1)
|
||||
to_chat(user, "<span class='notice'>Localized Damage:</span>")
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
update_icons()
|
||||
timeofdeath = world.time
|
||||
if(mind) mind.store_memory("Time of death: [worldtime2text(timeofdeath)]", 0)
|
||||
if(mind) mind.store_memory("Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]", 0)
|
||||
|
||||
sql_report_cyborg_death(src)
|
||||
|
||||
|
||||
@@ -166,6 +166,9 @@
|
||||
set category = "Robot Commands"
|
||||
set name = "Power Warning"
|
||||
|
||||
if(handle_emote_CD(50))
|
||||
return
|
||||
|
||||
if(!is_component_functioning("power cell") || !cell || !cell.charge)
|
||||
visible_message("The power warning light on <span class='name'>[src]</span> flashes urgently.",\
|
||||
"You announce you are operating in low power mode.")
|
||||
|
||||
@@ -49,6 +49,8 @@ var/list/robot_verbs_default = list(
|
||||
var/datum/wires/robot/wires = null
|
||||
|
||||
var/opened = 0
|
||||
var/custom_panel = null
|
||||
var/list/custom_panel_names = list("Cricket")
|
||||
var/emagged = 0
|
||||
|
||||
var/list/force_modules = list()
|
||||
@@ -314,6 +316,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Default"] = "Service2"
|
||||
module_sprites["Standard"] = "robotServ"
|
||||
module_sprites["Noble-SRV"] = "Noble-SRV"
|
||||
module_sprites["Cricket"] = "Cricket-SERV"
|
||||
|
||||
if("Miner")
|
||||
module = new /obj/item/weapon/robot_module/miner(src)
|
||||
@@ -325,6 +328,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Treadhead"] = "Miner"
|
||||
module_sprites["Standard"] = "robotMine"
|
||||
module_sprites["Noble-DIG"] = "Noble-DIG"
|
||||
module_sprites["Cricket"] = "Cricket-MINE"
|
||||
|
||||
if("Medical")
|
||||
module = new /obj/item/weapon/robot_module/medical(src)
|
||||
@@ -337,6 +341,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Needles"] = "medicalrobot"
|
||||
module_sprites["Standard"] = "robotMedi"
|
||||
module_sprites["Noble-MED"] = "Noble-MED"
|
||||
module_sprites["Cricket"] = "Cricket-MEDI"
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
if("Security")
|
||||
@@ -348,6 +353,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Bloodhound"] = "bloodhound"
|
||||
module_sprites["Standard"] = "robotSecy"
|
||||
module_sprites["Noble-SEC"] = "Noble-SEC"
|
||||
module_sprites["Cricket"] = "Cricket-SEC"
|
||||
status_flags &= ~CANPUSH
|
||||
|
||||
if("Engineering")
|
||||
@@ -360,6 +366,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Landmate"] = "landmate"
|
||||
module_sprites["Standard"] = "robotEngi"
|
||||
module_sprites["Noble-ENG"] = "Noble-ENG"
|
||||
module_sprites["Cricket"] = "Cricket-ENGI"
|
||||
magpulse = 1
|
||||
|
||||
if("Janitor")
|
||||
@@ -370,6 +377,7 @@ var/list/robot_verbs_default = list(
|
||||
module_sprites["Mop Gear Rex"] = "mopgearrex"
|
||||
module_sprites["Standard"] = "robotJani"
|
||||
module_sprites["Noble-CLN"] = "Noble-CLN"
|
||||
module_sprites["Cricket"] = "Cricket-JANI"
|
||||
|
||||
if("Combat")
|
||||
module = new /obj/item/weapon/robot_module/combat(src)
|
||||
@@ -567,10 +575,7 @@ var/list/robot_verbs_default = list(
|
||||
return 2
|
||||
|
||||
|
||||
/mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/weapon/restraints/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
|
||||
return
|
||||
|
||||
/mob/living/silicon/robot/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(opened) // Are they trying to insert something?
|
||||
for(var/V in components)
|
||||
var/datum/robot_component/C = components[V]
|
||||
@@ -610,6 +615,7 @@ var/list/robot_verbs_default = list(
|
||||
|
||||
|
||||
else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == INTENT_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
if(!getFireLoss())
|
||||
to_chat(user, "<span class='notice'>Nothing to fix!</span>")
|
||||
return
|
||||
@@ -744,9 +750,13 @@ var/list/robot_verbs_default = list(
|
||||
to_chat(user, "<span class='danger'>Upgrade error.</span>")
|
||||
|
||||
else
|
||||
spark_system.start()
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/robot/attacked_by(obj/item/I, mob/living/user, def_zone)
|
||||
if(I.force && I.damtype != STAMINA && stat != DEAD) //only sparks if real damage is dealt.
|
||||
spark_system.start()
|
||||
..()
|
||||
|
||||
/mob/living/silicon/robot/emag_act(user as mob)
|
||||
if(!ishuman(user) && !issilicon(user))
|
||||
return
|
||||
@@ -966,6 +976,9 @@ var/list/robot_verbs_default = list(
|
||||
if(custom_sprite) //Custom borgs also have custom panels, heh
|
||||
panelprefix = "[ckey]"
|
||||
|
||||
if(custom_panel in custom_panel_names) //For default borgs with different panels
|
||||
panelprefix = custom_panel
|
||||
|
||||
if(wiresexposed)
|
||||
overlays += "[panelprefix]-openpanel +w"
|
||||
else if(cell)
|
||||
@@ -1287,6 +1300,8 @@ var/list/robot_verbs_default = list(
|
||||
module.module_type = "Brobot"
|
||||
update_module_icon()
|
||||
lockcharge = null
|
||||
var/list/names = splittext(icontype, "-")
|
||||
custom_panel = trim(names[1])
|
||||
else
|
||||
to_chat(src, "Something is badly wrong with the sprite selection. Harass a coder.")
|
||||
icon_state = module_sprites[1]
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
health = 100
|
||||
maxHealth = 100
|
||||
damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
|
||||
|
||||
obj_damage = 60
|
||||
environment_smash = 2 //Walls can't stop THE LAW
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
|
||||
|
||||
@@ -221,8 +221,9 @@
|
||||
update_controls()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/medbot/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
/mob/living/simple_animal/bot/medbot/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/reagent_containers/glass))
|
||||
. = 1 //no afterattack
|
||||
if(locked)
|
||||
to_chat(user, "<span class='warning'>You cannot insert a beaker because the panel is locked!</span>")
|
||||
return
|
||||
@@ -236,7 +237,6 @@
|
||||
reagent_glass = W
|
||||
to_chat(user, "<span class='notice'>You insert [W].</span>")
|
||||
show_controls(user)
|
||||
return
|
||||
|
||||
else
|
||||
var/current_health = health
|
||||
|
||||
@@ -100,6 +100,7 @@
|
||||
health = 250
|
||||
response_harm = "harmlessly punches"
|
||||
harm_intent_damage = 0
|
||||
obj_damage = 90
|
||||
melee_damage_lower = 30
|
||||
melee_damage_upper = 30
|
||||
attacktext = "smashes their armoured gauntlet into"
|
||||
@@ -181,7 +182,7 @@
|
||||
/mob/living/simple_animal/hostile/construct/builder
|
||||
name = "Artificer"
|
||||
real_name = "Artificer"
|
||||
desc = "A bulbous construct dedicated to building and maintaining The Cult of Nar-Sie's armies"
|
||||
desc = "A bulbous construct dedicated to building and maintaining Cult armies."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "artificer"
|
||||
icon_living = "artificer"
|
||||
@@ -189,6 +190,7 @@
|
||||
health = 50
|
||||
response_harm = "viciously beats"
|
||||
harm_intent_damage = 5
|
||||
obj_damage = 60
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
attacktext = "rams"
|
||||
@@ -302,7 +304,7 @@
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 5
|
||||
attacktext = "prods"
|
||||
environment_smash = 3
|
||||
environment_smash = ENVIRONMENT_SMASH_RWALLS
|
||||
see_in_dark = 8
|
||||
attack_sound = 'sound/weapons/tap.ogg'
|
||||
const_type = "harvester"
|
||||
|
||||
@@ -175,3 +175,5 @@
|
||||
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
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 15
|
||||
@@ -37,4 +37,6 @@
|
||||
faction = list("syndicate")
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
|
||||
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
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 20
|
||||
@@ -9,7 +9,7 @@
|
||||
health = 5
|
||||
maxHealth = 5
|
||||
attacktext = "bites"
|
||||
attacktext = "bites"
|
||||
obj_damage = 0
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 2
|
||||
response_help = "pets"
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "kicks"
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
|
||||
melee_damage_lower = 18
|
||||
melee_damage_upper = 18
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
speed = 2
|
||||
@@ -28,4 +28,4 @@
|
||||
/mob/living/simple_animal/pet/sloth/paperwork
|
||||
name = "Paperwork"
|
||||
desc = "Cargo's pet sloth. About as useful as the rest of the techs."
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
|
||||
@@ -14,6 +14,7 @@
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
harm_intent_damage = 5
|
||||
obj_damage = 60
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
attacktext = "slashes"
|
||||
@@ -145,6 +146,7 @@
|
||||
melee_damage_upper = 0
|
||||
a_intent = INTENT_HELP
|
||||
friendly = "caresses"
|
||||
obj_damage = 0
|
||||
environment_smash = 0
|
||||
icon_state = "maid"
|
||||
icon_living = "maid"
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
stop_automated_movement_when_pulled = 0
|
||||
maxHealth = 60
|
||||
health = 60
|
||||
obj_damage = 60
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 30
|
||||
attacktext = "mauls"
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
health = 10
|
||||
faction = list("hostile")
|
||||
move_to_delay = 0
|
||||
obj_damage = 0
|
||||
environment_smash = 0
|
||||
mouse_opacity = 2
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
health = 25
|
||||
|
||||
harm_intent_damage = 8
|
||||
obj_damage = 50
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
attacktext = "bites"
|
||||
@@ -70,6 +71,6 @@
|
||||
health = 65
|
||||
pixel_x = -16
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
|
||||
obj_damage = 80
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 20
|
||||
@@ -8,6 +8,7 @@
|
||||
icon_dead = "otherthing-dead"
|
||||
health = 80
|
||||
maxHealth = 80
|
||||
obj_damage = 100
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 50
|
||||
attacktext = "chomps"
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
armour_penetration = 25
|
||||
melee_damage_lower = 10
|
||||
melee_damage_upper = 100
|
||||
environment_smash = 3
|
||||
environment_smash = ENVIRONMENT_SMASH_RWALLS
|
||||
|
||||
force_threshold = 15
|
||||
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)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
speed = 0
|
||||
maxHealth = 80
|
||||
health = 80
|
||||
|
||||
obj_damage = 50
|
||||
harm_intent_damage = 10
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
response_harm = "hits"
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
obj_damage = 60
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 20
|
||||
heat_damage_per_tick = 20 //amount of damage applied if animal's body temperature is higher than maxbodytemp
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
faction = list("creature")
|
||||
robust_searching = 1
|
||||
stat_attack = 2
|
||||
obj_damage = 0
|
||||
environment_smash = 0
|
||||
speak_emote = list("squeaks")
|
||||
ventcrawler = 2
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/mob/living/simple_animal/hostile
|
||||
faction = list("hostile")
|
||||
stop_automated_movement_when_pulled = 0
|
||||
obj_damage = 40
|
||||
environment_smash = 1 //Set to 1 to break closets,tables,racks, etc; 2 for walls; 3 for rwalls
|
||||
var/atom/target
|
||||
var/ranged = 0
|
||||
@@ -241,7 +242,7 @@
|
||||
if(target.loc != null && get_dist(targets_from, target.loc) <= vision_range) //We can't see our target, but he's in our vision range still
|
||||
if(ranged_ignores_vision && ranged_cooldown <= world.time) //we can't see our target... but we can fire at them!
|
||||
OpenFire(target)
|
||||
if(environment_smash >= 2) //If we're capable of smashing through walls, forget about vision completely after finding our target
|
||||
if((environment_smash & ENVIRONMENT_SMASH_WALLS) || (environment_smash & ENVIRONMENT_SMASH_RWALLS)) //If we're capable of smashing through walls, forget about vision completely after finding our target
|
||||
Goto(target,move_to_delay,minimum_distance)
|
||||
FindHidden()
|
||||
return 1
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
speed = -1
|
||||
obj_damage = 0
|
||||
environment_smash = 0
|
||||
|
||||
|
||||
|
||||
@@ -267,6 +267,7 @@ Difficulty: Medium
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
faction = list("neutral")
|
||||
obj_damage = 80
|
||||
melee_damage_upper = 30
|
||||
melee_damage_lower = 30
|
||||
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
maxHealth = 1000
|
||||
a_intent = INTENT_HARM
|
||||
sentience_type = SENTIENCE_BOSS
|
||||
environment_smash = 3
|
||||
environment_smash = ENVIRONMENT_SMASH_RWALLS
|
||||
obj_damage = 400
|
||||
luminosity = 3
|
||||
faction = list("mining", "boss")
|
||||
weather_immunities = list("lava","ash")
|
||||
|
||||
@@ -225,6 +225,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
|
||||
/mob/living/simple_animal/hostile/mimic/copy/ranged/CopyObject(obj/O, mob/living/creator, destroy_original = 0)
|
||||
if(..())
|
||||
emote_see = list("aims menacingly")
|
||||
obj_damage = 0
|
||||
environment_smash = 0 //needed? seems weird for them to do so
|
||||
ranged = 1
|
||||
retreat_distance = 1 //just enough to shoot
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
maxHealth = 75
|
||||
health = 75
|
||||
harm_intent_damage = 5
|
||||
obj_damage = 0
|
||||
melee_damage_lower = 0
|
||||
melee_damage_upper = 0
|
||||
attacktext = "lashes out at"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
unsuitable_atmos_damage = 15
|
||||
faction = list("mining")
|
||||
weather_immunities = list("lava","ash")
|
||||
obj_damage = 30
|
||||
environment_smash = 2
|
||||
minbodytemp = 0
|
||||
heat_damage_per_tick = 20
|
||||
@@ -65,6 +66,7 @@
|
||||
maxHealth = 200
|
||||
health = 200
|
||||
harm_intent_damage = 5
|
||||
obj_damage = 60
|
||||
melee_damage_lower = 12
|
||||
melee_damage_upper = 12
|
||||
attacktext = "bites into"
|
||||
@@ -125,6 +127,7 @@
|
||||
maxHealth = 300
|
||||
health = 300
|
||||
harm_intent_damage = 1 //Only the manliest of men can kill a Goliath with only their fists.
|
||||
obj_damage = 100
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
attacktext = "pulverizes"
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
response_disarm = "gently pushes aside"
|
||||
response_harm = "whacks"
|
||||
harm_intent_damage = 5
|
||||
obj_damage = 0
|
||||
melee_damage_lower = 1
|
||||
melee_damage_upper = 1
|
||||
attack_same = 2
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
health = 100
|
||||
|
||||
harm_intent_damage = 5
|
||||
obj_damage = 60
|
||||
melee_damage_lower = 30
|
||||
melee_damage_upper = 30
|
||||
attacktext = "slashes"
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
melee_damage_upper = 10
|
||||
attacktext = "attacks"
|
||||
attack_sound = 'sound/items/bikehorn.ogg'
|
||||
obj_damage = 0
|
||||
environment_smash = 0
|
||||
minbodytemp = 270
|
||||
maxbodytemp = 370
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
healable = 0
|
||||
|
||||
harm_intent_damage = 35
|
||||
obj_damage = 100
|
||||
melee_damage_lower = 34
|
||||
melee_damage_upper = 42
|
||||
attacktext = "claws"
|
||||
|
||||
@@ -112,6 +112,7 @@
|
||||
pass_flags = PASSTABLE
|
||||
health = 15
|
||||
maxHealth = 15
|
||||
obj_damage = 0
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
attacktext = "cuts"
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
move_to_delay = 4 // faster than normal
|
||||
ventcrawler = 0
|
||||
ai_ventcrawls = 0
|
||||
environment_smash = 3
|
||||
environment_smash = ENVIRONMENT_SMASH_RWALLS
|
||||
loot = list(/obj/item/clothing/accessory/medal)
|
||||
idle_ventcrawl_chance = 0
|
||||
spider_tier = TS_TIER_3
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
spider_opens_doors = 2
|
||||
ventcrawler = 0
|
||||
ai_ventcrawls = 0
|
||||
environment_smash = 3
|
||||
environment_smash = ENVIRONMENT_SMASH_RWALLS
|
||||
idle_ventcrawl_chance = 0 // stick to the queen!
|
||||
var/dcheck_counter = 0
|
||||
var/queen_visible = 1
|
||||
|
||||
@@ -232,7 +232,7 @@
|
||||
hasnested = 1
|
||||
ventcrawler = 0
|
||||
ai_ventcrawls = 0
|
||||
environment_smash = 3
|
||||
environment_smash = ENVIRONMENT_SMASH_RWALLS
|
||||
DoQueenScreech(8, 100, 8, 100)
|
||||
MassFlicker()
|
||||
to_chat(src, "<span class='notice'>You have matured to your egglaying stage. You can now smash through walls, and lay eggs, but can no longer ventcrawl.</span>")
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
maxHealth = 50
|
||||
ranged = 1
|
||||
harm_intent_damage = 5
|
||||
obj_damage = 60
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
a_intent = INTENT_HARM
|
||||
|
||||
@@ -687,7 +687,15 @@
|
||||
"STOP HOT-WIRING THE ENGINE, FUCKING CHRIST!",
|
||||
"Wire the solars, you lazy bums!",
|
||||
"WHO TOOK THE DAMN HARDSUITS?",
|
||||
"OH GOD ITS FREE CALL THE SHUTTLE")
|
||||
"OH GOD ITS FREE CALL THE SHUTTLE",
|
||||
"Why are there so many atmos alerts?",
|
||||
"OH GOD WHY WOULD YOU TURN ON THE PA BEFORE CONTAINMENT IS UP?",
|
||||
"Remember to lock the emitters!",
|
||||
"Stop goofing off and repair the goddam station!",
|
||||
"The singularity is not your friend!",
|
||||
"What were the wires again?",
|
||||
"Goddam emaggers!"
|
||||
)
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
|
||||
|
||||
/mob/living/simple_animal/parrot/Poly/New()
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
|
||||
var/melee_damage_lower = 0
|
||||
var/melee_damage_upper = 0
|
||||
var/obj_damage = 0 //how much damage this simple animal does to objects, if any
|
||||
var/armour_penetration = 0 //How much armour they ignore, as a flat reduction from the targets armour value
|
||||
var/melee_damage_type = BRUTE //Damage type of a simple mob's melee attack, should it do damage.
|
||||
var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) // 1 for full damage , 0 for none , -1 for 1:1 heal from that source
|
||||
@@ -276,9 +277,6 @@
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
attack_threshold_check(damage,M.melee_damage_type)
|
||||
|
||||
/mob/living/simple_animal/proc/attacked_by(obj/item/I, mob/living/user) // Handled in _onclick/click.dm
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(!Proj)
|
||||
return
|
||||
@@ -385,7 +383,7 @@
|
||||
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/attackby(var/obj/item/O as obj, var/mob/living/user as mob) //Marker -Agouri
|
||||
/mob/living/simple_animal/attackby(obj/item/O, mob/living/user)
|
||||
if(can_collar && !collar && istype(O, /obj/item/clothing/accessory/petcollar))
|
||||
var/obj/item/clothing/accessory/petcollar/C = O
|
||||
user.drop_item()
|
||||
@@ -399,33 +397,7 @@
|
||||
real_name = C.tagname
|
||||
return
|
||||
else
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
if(attempt_harvest(O, user))
|
||||
return
|
||||
user.do_attack_animation(src)
|
||||
if(istype(O) && istype(user) && !O.attack(src, user))
|
||||
var/damage = 0
|
||||
if(O.force)
|
||||
if(O.force >= force_threshold)
|
||||
damage = O.force
|
||||
if(O.damtype == STAMINA)
|
||||
damage = 0
|
||||
if(O.damtype == BRUTE)
|
||||
if(prob(33))
|
||||
O.add_mob_blood(src)
|
||||
var/turf/location = get_turf(src)
|
||||
add_splatter_floor(location)
|
||||
if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood
|
||||
user.add_mob_blood(src)
|
||||
visible_message("<span class='danger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] [src] with [O]!</span>",\
|
||||
"<span class='userdanger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] you with [O]!</span>")
|
||||
else
|
||||
visible_message("<span class='danger'>[O] bounces harmlessly off of [src].</span>",\
|
||||
"<span class='userdanger'>[O] bounces harmlessly off of [src].</span>")
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] gently taps [src] with [O].</span>",\
|
||||
"<span class='warning'>This weapon is ineffective, it does no damage.</span>")
|
||||
adjustBruteLoss(damage)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/movement_delay()
|
||||
. = ..()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/mob/Logout()
|
||||
nanomanager.user_logout(src) // this is used to clean up (remove) this user's Nano UIs
|
||||
SSnanoui.user_logout(src) // this is used to clean up (remove) this user's Nano UIs
|
||||
unset_machine()
|
||||
player_list -= src
|
||||
log_access("Logout: [key_name(src)]")
|
||||
|
||||
+21
-1
@@ -946,12 +946,32 @@ var/list/slot_equipment_priority = list( \
|
||||
|
||||
if(processScheduler)
|
||||
processScheduler.statProcesses()
|
||||
if(statpanel("MC")) //looking at that panel
|
||||
var/turf/T = get_turf(client.eye)
|
||||
stat("Location:", COORD(T))
|
||||
stat("CPU:", "[world.cpu]")
|
||||
stat("Instances:", "[num2text(world.contents.len, 10)]")
|
||||
GLOB.stat_entry()
|
||||
stat(null)
|
||||
if(Master)
|
||||
Master.stat_entry()
|
||||
else
|
||||
stat("Master Controller:", "ERROR")
|
||||
if(Failsafe)
|
||||
Failsafe.stat_entry()
|
||||
else
|
||||
stat("Failsafe Controller:", "ERROR")
|
||||
if(Master)
|
||||
stat(null)
|
||||
for(var/datum/controller/subsystem/SS in Master.subsystems)
|
||||
SS.stat_entry()
|
||||
|
||||
statpanel("Status") // Switch to the Status panel again, for the sake of the lazy Stat procs
|
||||
|
||||
// this function displays the station time in the status panel
|
||||
/mob/proc/show_stat_station_time()
|
||||
stat(null, "Station Time: [worldtime2text()]")
|
||||
stat(null, "Round Time: [worldtime2text()]")
|
||||
stat(null, "Station Time: [station_time_timestamp()]")
|
||||
|
||||
// this function displays the shuttles ETA in the status panel if the shuttle has been called
|
||||
/mob/proc/show_stat_emergency_shuttle_eta()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user