mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-08-29 06:56:23 +01:00
Merge branch 'virgoMaster' into virgoPull
This commit is contained in:
@@ -6,13 +6,13 @@ world/IsBanned(key,address,computer_id)
|
||||
|
||||
//Guest Checking
|
||||
if(!config.guests_allowed && IsGuestKey(key))
|
||||
log_access("Failed Login: [key] - Guests not allowed")
|
||||
log_adminwarn("Failed Login: [key] - Guests not allowed")
|
||||
message_admins("<font color='blue'>Failed Login: [key] - Guests not allowed</font>")
|
||||
return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a byond account.")
|
||||
|
||||
//check if the IP address is a known TOR node
|
||||
if(config && config.ToRban && ToRban_isbanned(address))
|
||||
log_access("Failed Login: [src] - Banned: ToR")
|
||||
log_adminwarn("Failed Login: [src] - Banned: ToR")
|
||||
message_admins("<font color='blue'>Failed Login: [src] - Banned: ToR</font>")
|
||||
//ban their computer_id and ckey for posterity
|
||||
AddBan(ckey(key), computer_id, "Use of ToR", "Automated Ban", 0, 0)
|
||||
@@ -24,7 +24,7 @@ world/IsBanned(key,address,computer_id)
|
||||
//Ban Checking
|
||||
. = CheckBan( ckey(key), computer_id, address )
|
||||
if(.)
|
||||
log_access("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
|
||||
log_adminwarn("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]")
|
||||
message_admins("<font color='blue'>Failed Login: [key] id:[computer_id] ip:[address] - Banned [.["reason"]]</font>")
|
||||
return .
|
||||
|
||||
|
||||
@@ -12,7 +12,6 @@ var/global/floorIsLava = 0
|
||||
C << msg
|
||||
|
||||
/proc/msg_admin_attack(var/text) //Toggleable Attack Messages
|
||||
log_attack(text)
|
||||
var/rendered = "<span class=\"log_message\"><span class=\"prefix\">ATTACK:</span> <span class=\"message\">[text]</span></span>"
|
||||
for(var/client/C in admins)
|
||||
if((R_ADMIN|R_MOD) & C.holder.rights)
|
||||
@@ -380,7 +379,7 @@ proc/admin_notice(var/message, var/rights)
|
||||
if(3)
|
||||
dat+={"
|
||||
Creating new Feed Message...
|
||||
<HR><B><A href='?src=\ref[src];ac_set_channel_receiving=1'>Receiving Channel</A>:</B> [src.admincaster_feed_channel.channel_name]<BR>" //MARK
|
||||
<HR><B><A href='?src=\ref[src];ac_set_channel_receiving=1'>Receiving Channel</A>:</B> [src.admincaster_feed_channel.channel_name]<BR>
|
||||
<B>Message Author:</B> <FONT COLOR='green'>[src.admincaster_signature]</FONT><BR>
|
||||
<B><A href='?src=\ref[src];ac_set_new_message=1'>Message Body</A>:</B> [src.admincaster_feed_message.body] <BR>
|
||||
<BR><A href='?src=\ref[src];ac_submit_new_message=1'>Submit</A><BR><BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A><BR>
|
||||
@@ -677,10 +676,7 @@ var/datum/announcement/minor/admin_min_announcer = new
|
||||
set desc = "Send an intercom message, like an arrivals announcement."
|
||||
if(!check_rights(0)) return
|
||||
|
||||
//This is basically how death alarms do it
|
||||
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/omni(null)
|
||||
|
||||
var/channel = input("Channel for message:","Channel", null) as null|anything in (list("Common") + a.keyslot2.channels) // + a.keyslot1.channels
|
||||
var/channel = input("Channel for message:","Channel", null) as null|anything in radiochannels
|
||||
|
||||
if(channel) //They picked a channel
|
||||
var/sender = input("Name of sender (max 75):", "Announcement", "Announcement Computer") as null|text
|
||||
@@ -691,11 +687,94 @@ var/datum/announcement/minor/admin_min_announcer = new
|
||||
|
||||
if(message) //They put a message
|
||||
message = sanitize(message, 500, extra = 0)
|
||||
a.autosay("[message]", "[sender]", "[channel == "Common" ? null : channel]") //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set.
|
||||
global_announcer.autosay("[message]", "[sender]", "[channel == "Common" ? null : channel]") //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set.
|
||||
log_admin("Intercom: [key_name(usr)] : [sender]:[message]")
|
||||
qdel(a)
|
||||
|
||||
feedback_add_details("admin_verb","IN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/datum/admins/proc/intercom_convo()
|
||||
set category = "Fun"
|
||||
set name = "Intercom Convo"
|
||||
set desc = "Send an intercom conversation, like several uses of the Intercom Msg verb."
|
||||
set waitfor = FALSE //Why bother? We have some sleeps. You can leave tho!
|
||||
if(!check_rights(0)) return
|
||||
|
||||
var/channel = input("Channel for message:","Channel", null) as null|anything in radiochannels
|
||||
|
||||
if(!channel) //They picked a channel
|
||||
return
|
||||
|
||||
to_chat(usr,"<span class='notice'><B>Intercom Convo Directions</B><br>Start the conversation with the sender, a pipe (|), and then the message on one line. Then hit enter to \
|
||||
add another line, and type a (whole) number of seconds to pause between that message, and the next message, then repeat the message syntax up to 20 times. For example:<br>\
|
||||
--- --- ---<br>\
|
||||
Some Guy|Hello guys, what's up?<br>\
|
||||
5<br>\
|
||||
Other Guy|Hey, good to see you.<br>\
|
||||
5<br>\
|
||||
Some Guy|Yeah, you too.<br>\
|
||||
--- --- ---<br>\
|
||||
The above will result in those messages playing, with a 5 second gap between each. Maximum of 20 messages allowed.</span>")
|
||||
|
||||
var/list/decomposed
|
||||
var/message = input(usr,"See your chat box for instructions. Keep a copy elsewhere in case it is rejected when you click OK.", "Input Conversation", "") as null|message
|
||||
|
||||
if(!message)
|
||||
return
|
||||
|
||||
//Split on pipe or \n
|
||||
decomposed = splittext(message,regex("\\||$","m"))
|
||||
decomposed += "0" //Tack on a final 0 sleep to make 3-per-message evenly
|
||||
|
||||
//Time to find how they screwed up.
|
||||
//Wasn't the right length
|
||||
if((decomposed.len) % 3) //+1 to accomidate the lack of a wait time for the last message
|
||||
to_chat(usr,"<span class='warning'>You passed [decomposed.len] segments (senders+messages+pauses). You must pass a multiple of 3, minus 1 (no pause after the last message). That means a sender and message on every other line (starting on the first), separated by a pipe character (|), and a number every other line that is a pause in seconds.</span>")
|
||||
return
|
||||
|
||||
//Too long a conversation
|
||||
if((decomposed.len / 3) > 20)
|
||||
to_chat(usr,"<span class='warning'>This conversation is too long! 20 messages maximum, please.</span>")
|
||||
return
|
||||
|
||||
//Missed some sleeps, or sanitized to nothing.
|
||||
for(var/i = 1; i < decomposed.len; i++)
|
||||
|
||||
//Sanitize sender
|
||||
var/clean_sender = sanitize(decomposed[i])
|
||||
if(!clean_sender)
|
||||
to_chat(usr,"<span class='warning'>One part of your conversation was not able to be sanitized. It was the sender of the [(i+2)/3]\th message.</span>")
|
||||
return
|
||||
decomposed[i] = clean_sender
|
||||
|
||||
//Sanitize message
|
||||
var/clean_message = sanitize(decomposed[++i])
|
||||
if(!clean_message)
|
||||
to_chat(usr,"<span class='warning'>One part of your conversation was not able to be sanitized. It was the body of the [(i+2)/3]\th message.</span>")
|
||||
return
|
||||
decomposed[i] = clean_message
|
||||
|
||||
//Sanitize wait time
|
||||
var/clean_time = text2num(decomposed[++i])
|
||||
if(!isnum(clean_time))
|
||||
to_chat(usr,"<span class='warning'>One part of your conversation was not able to be sanitized. It was the wait time after the [(i+2)/3]\th message.</span>")
|
||||
return
|
||||
if(clean_time > 60)
|
||||
to_chat(usr,"<span class='warning'>Max 60 second wait time between messages for sanity's sake please.</span>")
|
||||
return
|
||||
decomposed[i] = clean_time
|
||||
|
||||
log_admin("Intercom convo started by: [key_name(usr)] : [sanitize(message)]")
|
||||
feedback_add_details("admin_verb","IN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
//Sanitized AND we still have a chance to send it? Wow!
|
||||
if(LAZYLEN(decomposed))
|
||||
for(var/i = 1; i < decomposed.len; i++)
|
||||
var/this_sender = decomposed[i]
|
||||
var/this_message = decomposed[++i]
|
||||
var/this_wait = decomposed[++i]
|
||||
global_announcer.autosay("[this_message]", "[this_sender]", "[channel == "Common" ? null : channel]") //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set.
|
||||
sleep(this_wait SECONDS)
|
||||
|
||||
/datum/admins/proc/toggleooc()
|
||||
set category = "Server"
|
||||
set desc="Globally Toggles OOC"
|
||||
|
||||
@@ -16,7 +16,7 @@ proc/log_and_message_admins_many(var/list/mob/users, var/message)
|
||||
|
||||
log_admin("[english_list(user_keys)] [message]")
|
||||
message_admins("[english_list(user_keys)] [message]")
|
||||
|
||||
/* Old procs
|
||||
proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, var/victim_message, var/admin_message)
|
||||
if(victim)
|
||||
victim.attack_log += text("\[[time_stamp()]\] <font color='orange'>[key_name(attacker)] - [victim_message]</font>")
|
||||
@@ -42,3 +42,4 @@ proc/admin_inject_log(mob/attacker, mob/victim, obj/item/weapon, reagents, amoun
|
||||
"used \the [weapon] to [violent]inject - [reagents] - [amount_transferred]u transferred",
|
||||
"was [violent]injected with \the [weapon] - [reagents] - [amount_transferred]u transferred",
|
||||
"used \the [weapon] to [violent]inject [reagents] ([amount_transferred]u transferred) into")
|
||||
*/
|
||||
|
||||
@@ -26,6 +26,7 @@ var/list/admin_verbs_admin = list(
|
||||
/datum/admins/proc/toggleguests, //toggles whether guests can join the current game,
|
||||
/datum/admins/proc/announce, //priority announce something to all clients.,
|
||||
/datum/admins/proc/intercom, //send a fake intercom message, like an arrivals announcement,
|
||||
/datum/admins/proc/intercom_convo, //send a fake intercom conversation, like an ATC exchange,
|
||||
/client/proc/colorooc, //allows us to set a custom colour for everythign we say in ooc,
|
||||
/client/proc/admin_ghost, //allows us to ghost/reenter body at will,
|
||||
/client/proc/toggle_view_range, //changes how far we can see,
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
if(!msg)
|
||||
return
|
||||
|
||||
log_admin("ADMIN: [key_name(src)] : [msg]")
|
||||
log_adminsay(msg,src)
|
||||
|
||||
if(check_rights(R_ADMIN,0))
|
||||
for(var/client/C in admins)
|
||||
@@ -27,7 +27,7 @@
|
||||
return
|
||||
|
||||
msg = sanitize(msg)
|
||||
log_admin("MOD: [key_name(src)] : [msg]")
|
||||
log_modsay(msg,src)
|
||||
|
||||
if (!msg)
|
||||
return
|
||||
@@ -50,7 +50,7 @@
|
||||
return
|
||||
|
||||
msg = sanitize(msg)
|
||||
log_admin("EVENT: [key_name(src)] : [msg]")
|
||||
log_eventsay(msg,src)
|
||||
|
||||
if (!msg)
|
||||
return
|
||||
|
||||
@@ -39,4 +39,4 @@
|
||||
if((M.mind && M.mind.special_role && A && A.can_use_aooc) || isobserver(M)) // Antags must have their type be allowed to AOOC to see AOOC. This prevents, say, ERT from seeing AOOC.
|
||||
to_chat(M, "<span class='ooc'><span class='aooc'>[create_text_tag("aooc", "Antag-OOC:", M.client)] <EM>[player_display]:</EM> <span class='message'>[msg]</span></span></span>")
|
||||
|
||||
log_ooc("(ANTAG) [key] : [msg]")
|
||||
log_aooc(msg,src)
|
||||
@@ -85,7 +85,7 @@
|
||||
set name = "Show Server Log"
|
||||
set desc = "Shows today's server log."
|
||||
|
||||
var/path = "data/logs/[time2text(world.realtime,"YYYY/MM-Month/DD-Day")].log"
|
||||
var/path = "[log_path].log"
|
||||
if( fexists(path) )
|
||||
src << run( file(path) )
|
||||
else
|
||||
@@ -99,7 +99,10 @@
|
||||
set category = "Admin"
|
||||
set name = "Show Server Attack Log"
|
||||
set desc = "Shows today's server attack log."
|
||||
|
||||
to_chat(usr,"This verb doesn't actually do anything.")
|
||||
|
||||
/*
|
||||
var/path = "data/logs/[time2text(world.realtime,"YYYY/MM-Month/DD-Day")] Attack.log"
|
||||
if( fexists(path) )
|
||||
src << run( file(path) )
|
||||
@@ -109,3 +112,5 @@
|
||||
usr << run( file(path) )
|
||||
feedback_add_details("admin_verb","SSAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
return
|
||||
*/
|
||||
|
||||
@@ -143,7 +143,12 @@
|
||||
vtext = "<a href='?_src_=vars;Vars=\ref[C]'>\ref[C]</a> - [C] ([C.type])"
|
||||
else if(islist(value))
|
||||
var/list/L = value
|
||||
vtext = "/list ([L.len])"
|
||||
var/removed = 0
|
||||
if(varname == "contents")
|
||||
var/list/original = value
|
||||
L = original.Copy() //We'll take a copy to manipulate
|
||||
removed = D.view_variables_filter_contents(L)
|
||||
vtext = "/list ([L.len]+[removed]H)"
|
||||
if(!(varname in view_variables_dont_expand) && L.len > 0 && L.len < 100)
|
||||
extra = "<ul>"
|
||||
var/index = 1
|
||||
@@ -158,3 +163,21 @@
|
||||
vtext = "[value]"
|
||||
|
||||
return "<li>[ecm][varname] = <span class='value'>[vtext]</span>[extra]</li>"
|
||||
|
||||
//Allows us to mask out some contents when it's not necessary to show them
|
||||
//For example, organs on humans, as the organs are stored in other lists which will also be present
|
||||
//So there's really no need to list them twice.
|
||||
/datum/proc/view_variables_filter_contents(list/L)
|
||||
return 0 //Return how many items you removed.
|
||||
|
||||
/mob/living/carbon/human/view_variables_filter_contents(list/L)
|
||||
. = ..()
|
||||
L -= ability_master
|
||||
.++
|
||||
|
||||
/mob/living/carbon/human/view_variables_filter_contents(list/L)
|
||||
. = ..()
|
||||
var/len_before = L.len
|
||||
L -= organs
|
||||
L -= internal_organs
|
||||
. += len_before - L.len
|
||||
|
||||
@@ -252,7 +252,7 @@
|
||||
//Panic bunker code
|
||||
if (isnum(player_age) && player_age == 0) //first connection
|
||||
if (config.panic_bunker && !holder && !deadmin_holder)
|
||||
log_access("Failed Login: [key] - New account attempting to connect during panic bunker")
|
||||
log_adminwarn("Failed Login: [key] - New account attempting to connect during panic bunker")
|
||||
message_admins("<span class='adminnotice'>Failed Login: [key] - New account attempting to connect during panic bunker</span>")
|
||||
to_chat(src, "Sorry but the server is currently not accepting connections from never before seen players.")
|
||||
qdel(src)
|
||||
|
||||
@@ -86,7 +86,18 @@ var/list/_client_preferences_by_type
|
||||
preference_mob.stop_all_music()
|
||||
else
|
||||
preference_mob.update_music()
|
||||
|
||||
//VOREStation Add - Need to put it here because it should be ordered riiiight here.
|
||||
/datum/client_preference/eating_noises
|
||||
description = "Eating Noises"
|
||||
key = "EATING_NOISES"
|
||||
enabled_description = "Noisy"
|
||||
disabled_description = "Silent"
|
||||
/datum/client_preference/digestion_noises
|
||||
description = "Digestion Noises"
|
||||
key = "DIGEST_NOISES"
|
||||
enabled_description = "Noisy"
|
||||
disabled_description = "Silent"
|
||||
//VOREStation Add End
|
||||
/datum/client_preference/ghost_ears
|
||||
description ="Ghost ears"
|
||||
key = "CHAT_GHOSTEARS"
|
||||
|
||||
@@ -7,9 +7,4 @@
|
||||
|
||||
/datum/gear/ears/headphones
|
||||
display_name = "headphones"
|
||||
path = /obj/item/clothing/ears/earmuffs/headphones
|
||||
/* VOREStation Edit - Make languages great again
|
||||
/datum/gear/ears/translator
|
||||
display_name = "universal translator, ear"
|
||||
path = /obj/item/device/universal_translator/ear
|
||||
cost = 8*/
|
||||
path = /obj/item/clothing/ears/earmuffs/headphones
|
||||
@@ -141,6 +141,14 @@
|
||||
display_name = "cowboy boots"
|
||||
path = /obj/item/clothing/shoes/boots/cowboy
|
||||
|
||||
/datum/gear/shoes/cowboy/classic
|
||||
display_name = "classic cowboy boots"
|
||||
path = /obj/item/clothing/shoes/boots/cowboy/classic
|
||||
|
||||
/datum/gear/shoes/cowboy/snakeskin
|
||||
display_name = "snakeskin cowboy boots"
|
||||
path = /obj/item/clothing/shoes/boots/cowboy/snakeskin
|
||||
|
||||
/datum/gear/shoes/jungle
|
||||
display_name = "jungle boots"
|
||||
path = /obj/item/clothing/shoes/boots/jungle
|
||||
|
||||
@@ -90,6 +90,14 @@
|
||||
display_name = "trenchcoat, grey"
|
||||
path = /obj/item/clothing/suit/storage/trench/grey
|
||||
|
||||
datum/gear/suit/duster
|
||||
display_name = "cowboy duster"
|
||||
path = /obj/item/clothing/suit/storage/duster
|
||||
|
||||
/datum/gear/suit/duster/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
/datum/gear/suit/hazard_vest
|
||||
display_name = "hazard vest selection"
|
||||
path = /obj/item/clothing/suit/storage/hazardvest
|
||||
|
||||
@@ -448,4 +448,12 @@
|
||||
|
||||
/datum/gear/uniform/bathrobe
|
||||
display_name = "bathrobe"
|
||||
path = /obj/item/clothing/under/bathrobe
|
||||
path = /obj/item/clothing/under/bathrobe
|
||||
|
||||
/datum/gear/uniform/flamenco
|
||||
display_name = "flamenco dress"
|
||||
path = /obj/item/clothing/under/dress/flamenco
|
||||
|
||||
/datum/gear/uniform/westernbustle
|
||||
display_name = "western bustle"
|
||||
path = /obj/item/clothing/under/dress/westernbustle
|
||||
@@ -121,11 +121,6 @@
|
||||
slot = "implant"
|
||||
exploitable = 1
|
||||
|
||||
/datum/gear/utility/translator
|
||||
display_name = "universal translator"
|
||||
path = /obj/item/device/universal_translator
|
||||
cost = 8
|
||||
|
||||
/datum/gear/utility/pen
|
||||
display_name = "Fountain Pen"
|
||||
path = /obj/item/weapon/pen/fountain
|
||||
@@ -138,3 +133,12 @@
|
||||
/datum/gear/utility/wheelchair/color/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
/datum/gear/utility/umbrella
|
||||
display_name = "Umbrella"
|
||||
path = /obj/item/weapon/melee/umbrella
|
||||
cost = 3
|
||||
|
||||
/datum/gear/utility/umbrella/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
@@ -147,4 +147,17 @@
|
||||
display_name = "cloth footwraps"
|
||||
path = /obj/item/clothing/shoes/footwraps
|
||||
sort_category = "Xenowear"
|
||||
cost = 1
|
||||
cost = 1
|
||||
|
||||
/datum/gear/uniform/cohesionsuits
|
||||
display_name = "cohesion suit selection (Promethean)"
|
||||
path = /obj/item/clothing/under/cohesion
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/uniform/cohesionsuits/New()
|
||||
..()
|
||||
var/list/cohesionsuits = list()
|
||||
for(var/cohesionsuit in (typesof(/obj/item/clothing/under/cohesion)))
|
||||
var/obj/item/clothing/under/cohesion/cohesion_type = cohesionsuit
|
||||
cohesionsuits[initial(cohesion_type.name)] = cohesion_type
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cohesionsuits))
|
||||
@@ -186,8 +186,9 @@
|
||||
pretty_ear_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/selection = input(user, "Pick ears", "Character Preference") as null|anything in pretty_ear_styles
|
||||
pref.ear_style = pretty_ear_styles[selection]
|
||||
var/new_ear_style = input(user, "Pick ears", "Character Preference", pref.ear_style) as null|anything in pretty_ear_styles
|
||||
if(new_ear_style)
|
||||
pref.ear_style = pretty_ear_styles[new_ear_style]
|
||||
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
@@ -218,8 +219,9 @@
|
||||
pretty_tail_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/selection = input(user, "Pick tails", "Character Preference") as null|anything in pretty_tail_styles
|
||||
pref.tail_style = pretty_tail_styles[selection]
|
||||
var/new_tail_style = input(user, "Pick tails", "Character Preference", pref.tail_style) as null|anything in pretty_tail_styles
|
||||
if(new_tail_style)
|
||||
pref.tail_style = pretty_tail_styles[new_tail_style]
|
||||
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
@@ -250,8 +252,9 @@
|
||||
pretty_wing_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/selection = input(user, "Pick wings", "Character Preference") as null|anything in pretty_wing_styles
|
||||
pref.wing_style = pretty_wing_styles[selection]
|
||||
var/new_wing_style = input(user, "Pick wings", "Character Preference", pref.wing_style) as null|anything in pretty_wing_styles
|
||||
if(new_wing_style)
|
||||
pref.wing_style = pretty_wing_styles[new_wing_style]
|
||||
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
/obj/item/clothing/proc/can_attach_accessory(obj/item/clothing/accessory/A)
|
||||
var/obj/item/clothing/accessory/attach = A
|
||||
if(src.valid_accessory_slots && (attach.slot in src.valid_accessory_slots))
|
||||
if(accessories.len && restricted_accessory_slots && (attach.slot in restricted_accessory_slots))
|
||||
if(src.valid_accessory_slots && (A.slot in src.valid_accessory_slots))
|
||||
if(accessories.len && restricted_accessory_slots && (A.slot in restricted_accessory_slots))
|
||||
for(var/obj/item/clothing/accessory/AC in accessories)
|
||||
if (AC.slot == attach.slot)
|
||||
if (AC.slot == A.slot)
|
||||
return FALSE
|
||||
return TRUE
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
@@ -31,7 +29,7 @@
|
||||
return
|
||||
if (ishuman(user) && src.loc == user)
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(src != H.l_store && src != H.r_store && src != H.s_store)
|
||||
if(src == H.w_uniform) // VOREStation Edit - Un-equip on single click, but not on uniform.
|
||||
return
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -292,6 +292,11 @@
|
||||
desc = "Because justice isn't going to dispense itself."
|
||||
icon_state = "cowboy_wide"
|
||||
|
||||
/obj/item/clothing/head/cowboy_hat/small
|
||||
name = "small cowboy hat"
|
||||
desc = "For the tiniest of cowboys."
|
||||
icon_state = "cowboy_small"
|
||||
|
||||
/obj/item/clothing/head/witchwig
|
||||
name = "witch costume wig"
|
||||
desc = "Eeeee~heheheheheheh!"
|
||||
|
||||
@@ -37,9 +37,9 @@
|
||||
if(reagents.total_volume)
|
||||
to_chat(H, "<span class='danger'>You feel a prick as you slip on \the [src].</span>")
|
||||
if(H.reagents)
|
||||
var/contained_reagents = reagents.get_reagents()
|
||||
var/contained = reagents.get_reagents()
|
||||
var/trans = reagents.trans_to_mob(H, 15, CHEM_BLOOD)
|
||||
admin_inject_log(usr, H, src, contained_reagents, trans)
|
||||
add_attack_logs(usr, H, "Injected with [name] containing [contained] transferred [trans] units")
|
||||
return
|
||||
|
||||
//Sleepy Ring
|
||||
@@ -61,7 +61,7 @@
|
||||
icon_state = "seal-secgen"
|
||||
|
||||
/obj/item/clothing/gloves/ring/seal/mason
|
||||
name = "masonic ring"
|
||||
name = "\improper Masonic ring"
|
||||
desc = "The Square and Compasses feature prominently on this Masonic ring."
|
||||
icon_state = "seal-masonic"
|
||||
|
||||
@@ -82,4 +82,4 @@
|
||||
|
||||
/obj/item/clothing/gloves/ring/seal/signet/proc/change_name(var/signet_name = "Unknown")
|
||||
name = "[signet_name]'s signet ring"
|
||||
desc = "A signet ring belonging to [signet_name], for when you're too sophisticated to sign letters."
|
||||
desc = "A signet ring belonging to [signet_name], for when you're too sophisticated to sign letters."
|
||||
|
||||
@@ -11,6 +11,18 @@
|
||||
desc = "Lacking a durasteel horse to ride."
|
||||
icon_state = "cowboy"
|
||||
|
||||
/obj/item/clothing/shoes/boots/cowboy/classic
|
||||
name = "classic cowboy boots"
|
||||
desc = "A classic looking pair of durable cowboy boots."
|
||||
icon_state = "cowboy_classic"
|
||||
item_state_slots = list(slot_r_hand_str = "leather", slot_l_hand_str = "leather")
|
||||
|
||||
/obj/item/clothing/shoes/boots/cowboy/snakeskin
|
||||
name = "snakeskin cowboy boots"
|
||||
desc = "A pair of cowboy boots made from python skin."
|
||||
icon_state = "cowboy_snakeskin"
|
||||
item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white")
|
||||
|
||||
/obj/item/clothing/shoes/boots/jackboots
|
||||
name = "jackboots"
|
||||
desc = "Standard-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
|
||||
|
||||
@@ -83,12 +83,8 @@
|
||||
|
||||
var/username = FindNameFromID(H) || "Unknown"
|
||||
var/message = "[username] has overridden [A] (airlock) in \the [get_area(A)] at [A.x],[A.y],[A.z] with \the [src]."
|
||||
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null)
|
||||
a.icon = icon
|
||||
a.icon_state = icon_state
|
||||
a.autosay(message, "Security Subsystem", "Command")
|
||||
a.autosay(message, "Security Subsystem", "Security")
|
||||
qdel(a)
|
||||
global_announcer.autosay(message, "Security Subsystem", "Command")
|
||||
global_announcer.autosay(message, "Security Subsystem", "Security")
|
||||
return 1
|
||||
|
||||
/obj/item/rig_module/rescue_pharm
|
||||
|
||||
@@ -348,6 +348,14 @@ obj/item/clothing/suit/storage/toggle/peacoat
|
||||
addblends = "peacoat_a"
|
||||
item_state_slots = list(slot_r_hand_str = "peacoat", slot_l_hand_str = "peacoat")
|
||||
flags_inv = HIDEHOLSTER
|
||||
|
||||
/obj/item/clothing/suit/storage/duster
|
||||
name = "cowboy duster"
|
||||
desc = "A duster commonly seen on cowboys from Earth's late 1800's."
|
||||
icon_state = "duster"
|
||||
blood_overlay_type = "coat"
|
||||
allowed = list(/obj/item/weapon/tank/emergency/oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter)
|
||||
flags_inv = HIDEHOLSTER
|
||||
/*
|
||||
* stripper
|
||||
*/
|
||||
|
||||
@@ -41,6 +41,23 @@
|
||||
user.do_attack_animation(M)
|
||||
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam
|
||||
|
||||
// Sheriff Badge (toy)
|
||||
/obj/item/clothing/accessory/badge/sheriff
|
||||
name = "sheriff badge"
|
||||
desc = "This town ain't big enough for the two of us, pardner."
|
||||
icon_state = "sheriff"
|
||||
item_state = "goldbadge"
|
||||
|
||||
/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user as mob)
|
||||
user.visible_message("[user] shows their sheriff badge. There's a new sheriff in town!",\
|
||||
"You flash the sheriff badge to everyone around you!")
|
||||
|
||||
/obj/item/clothing/accessory/badge/sheriff/attack(mob/living/carbon/human/M, mob/living/user)
|
||||
if(isliving(user))
|
||||
user.visible_message("<span class='danger'>[user] invades [M]'s personal space, the sheriff badge into their face!.</span>","<span class='danger'>You invade [M]'s personal space, thrusting the sheriff badge into their face insistently.</span>")
|
||||
user.do_attack_animation(M)
|
||||
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam
|
||||
|
||||
//.Holobadges.
|
||||
/obj/item/clothing/accessory/badge/holo
|
||||
name = "holobadge"
|
||||
@@ -129,4 +146,4 @@
|
||||
new /obj/item/clothing/accessory/badge/holo/hos(src)
|
||||
new /obj/item/clothing/accessory/badge/holo/cord(src)
|
||||
..()
|
||||
return
|
||||
return
|
||||
|
||||
@@ -394,6 +394,16 @@
|
||||
desc = "A red dress that sweeps to the side."
|
||||
icon_state = "red_swept_dress"
|
||||
|
||||
/obj/item/clothing/under/dress/flamenco
|
||||
name = "flamenco dress"
|
||||
desc = "A Mexican flamenco dress."
|
||||
icon_state = "flamenco"
|
||||
|
||||
/obj/item/clothing/under/dress/westernbustle
|
||||
name = "western bustle"
|
||||
desc = "A western bustle dress from Earth's late 1800's."
|
||||
icon_state = "westernbustle"
|
||||
|
||||
/*
|
||||
* wedding stuff
|
||||
*/
|
||||
@@ -816,4 +826,30 @@
|
||||
/obj/item/clothing/under/explorer
|
||||
desc = "A green uniform for operating in hazardous environments."
|
||||
name = "explorer's jumpsuit"
|
||||
icon_state = "explorer"
|
||||
icon_state = "explorer"
|
||||
|
||||
/obj/item/clothing/under/cohesion
|
||||
name = "black cohesion suit"
|
||||
desc = "A plain black cohesion suit intended to assist Prometheans in maintaining their form and prevent direct skin exposure."
|
||||
icon_state = "cohesionsuit"
|
||||
rolled_sleeves = -1 // defeats the purpose!!!
|
||||
|
||||
/obj/item/clothing/under/cohesion/striped
|
||||
name = "red striped cohesion suit"
|
||||
desc = "A black cohesion suit with red stripes intended to assist Prometheans in maintaining their form and prevent direct skin exposure."
|
||||
icon_state = "cohesionsuit_striped"
|
||||
|
||||
/obj/item/clothing/under/cohesion/decal
|
||||
name = "purple decaled cohesion suit"
|
||||
desc = "A white cohesion suit with purple decals intended to assist Prometheans in maintaining their form and prevent direct skin exposure."
|
||||
icon_state = "cohesionsuit_decal"
|
||||
|
||||
/obj/item/clothing/under/cohesion/pattern
|
||||
name = "blue patterned cohesion suit"
|
||||
desc = "A white cohesion suit with blue patterns intended to assist Prometheans in maintaining their form and prevent direct skin exposure."
|
||||
icon_state = "cohesionsuit_pattern"
|
||||
|
||||
/obj/item/clothing/under/cohesion/hazard
|
||||
name = "hazard cohesion suit"
|
||||
desc = "An orange cohesion suit with yellow hazard stripes intended to assist Prometheans in maintaining their form and prevent direct skin exposure."
|
||||
icon_state = "cohesionsuit_hazard"
|
||||
@@ -1,21 +1,5 @@
|
||||
/obj/item/clothing/var/hides_bulges = FALSE // OwO wats this?
|
||||
|
||||
/mob/living/carbon/human/proc/show_pudge()
|
||||
//A uniform could hide it.
|
||||
if(istype(w_uniform,/obj/item/clothing))
|
||||
var/obj/item/clothing/under = w_uniform
|
||||
if(under.hides_bulges)
|
||||
return FALSE
|
||||
|
||||
//We return as soon as we find one, no need for 'else' really.
|
||||
if(istype(wear_suit,/obj/item/clothing))
|
||||
var/obj/item/clothing/suit = wear_suit
|
||||
if(suit.hides_bulges)
|
||||
return FALSE
|
||||
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/under/permit
|
||||
name = "public nudity permit"
|
||||
desc = "This permit entitles the bearer to conduct their duties without a uniform. Normally issued to furred crewmembers or those with nothing to hide."
|
||||
|
||||
@@ -145,7 +145,7 @@ proc/spawn_money(var/sum, spawnloc, mob/living/carbon/human/human_user as mob)
|
||||
return
|
||||
|
||||
/obj/item/weapon/spacecash/ewallet
|
||||
name = "Charge card"
|
||||
name = "charge card"
|
||||
icon_state = "efundcard"
|
||||
desc = "A card that holds an amount of money."
|
||||
var/owner_name = "" //So the ATM can set it so the EFTPOS can put a valid name on transactions.
|
||||
|
||||
@@ -8,7 +8,7 @@ var/total_runtimes_skipped = 0
|
||||
#ifdef DEBUG
|
||||
/world/Error(var/exception/e, var/datum/e_src)
|
||||
if(!istype(e)) // Something threw an unusual exception
|
||||
log_to_dd("\[[time_stamp()]] Uncaught exception: [e]")
|
||||
log_error("\[[time_stamp()]] Uncaught exception: [e]")
|
||||
return ..()
|
||||
if(!error_last_seen) // A runtime is occurring too early in start-up initialization
|
||||
return ..()
|
||||
@@ -39,7 +39,7 @@ var/total_runtimes_skipped = 0
|
||||
var/skipcount = abs(error_cooldown[erroruid]) - 1
|
||||
error_cooldown[erroruid] = 0
|
||||
if(skipcount > 0)
|
||||
log_to_dd("\[[time_stamp()]] Skipped [skipcount] runtimes in [e.file],[e.line].")
|
||||
log_error("\[[time_stamp()]] Skipped [skipcount] runtimes in [e.file],[e.line].")
|
||||
error_cache.logError(e, skipCount = skipcount)
|
||||
error_last_seen[erroruid] = world.time
|
||||
error_cooldown[erroruid] = cooldown
|
||||
@@ -95,9 +95,9 @@ var/total_runtimes_skipped = 0
|
||||
desclines += " (This error will now be silenced for [ERROR_SILENCE_TIME / 600] minutes)"
|
||||
|
||||
// Now to actually output the error info...
|
||||
log_to_dd("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]")
|
||||
log_error("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]")
|
||||
for(var/line in desclines)
|
||||
log_to_dd(line)
|
||||
log_error(line)
|
||||
if(error_cache)
|
||||
error_cache.logError(e, desclines, e_src = e_src)
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
/turf/simulated/floor/holofloor/desert/New()
|
||||
..()
|
||||
if(prob(10))
|
||||
overlays += "asteroid[rand(0,9)]"
|
||||
add_overlay("asteroid[rand(0,9)]")
|
||||
|
||||
/obj/structure/holostool
|
||||
name = "stool"
|
||||
|
||||
@@ -23,23 +23,13 @@
|
||||
/*|| istype(tile, /turf/simulated/shuttle/floor)*/ \
|
||||
|| (locate(/obj/structure/catwalk) in tile))
|
||||
|
||||
|
||||
// WARNING - TOTAL HACK - HOOKING INIT
|
||||
/datum/controller/game_controller/setup_objects()
|
||||
..()
|
||||
generateHoloMinimaps()
|
||||
|
||||
/// Generates all the holo minimaps, initializing it all nicely, probably.
|
||||
// TODO - This should be a subsystem ~Leshana
|
||||
var/global/holomaps_initialized = FALSE
|
||||
var/global/list/holoMiniMaps = list()
|
||||
var/global/list/extraMiniMaps = list()
|
||||
/proc/generateHoloMinimaps()
|
||||
/datum/controller/subsystem/holomaps/proc/generateHoloMinimaps()
|
||||
var/start_time = world.timeofday
|
||||
// Build the base map for each z level
|
||||
for (var/z = 1 to world.maxz)
|
||||
global.holoMiniMaps |= z // hack, todo fix
|
||||
global.holoMiniMaps[z] = generateHoloMinimap(z)
|
||||
holoMiniMaps |= z // hack, todo fix
|
||||
holoMiniMaps[z] = generateHoloMinimap(z)
|
||||
|
||||
// Generate the area overlays, small maps, etc for the station levels.
|
||||
for (var/z in using_map.station_levels)
|
||||
@@ -49,7 +39,7 @@ var/global/list/extraMiniMaps = list()
|
||||
for(var/smoosh_list in using_map.holomap_smoosh)
|
||||
smooshTetherHolomaps(smoosh_list)
|
||||
|
||||
global.holomaps_initialized = TRUE
|
||||
holomaps_initialized = TRUE
|
||||
admin_notice("<span class='notice'>Holomaps initialized in [round(0.1*(world.timeofday-start_time),0.1)] seconds.</span>", R_DEBUG)
|
||||
|
||||
// TODO - Check - They had a delayed init perhaps?
|
||||
@@ -57,7 +47,7 @@ var/global/list/extraMiniMaps = list()
|
||||
S.setup_holomap()
|
||||
|
||||
// Generates the "base" holomap for one z-level, showing only the physical structure of walls and paths.
|
||||
/proc/generateHoloMinimap(var/zLevel = 1)
|
||||
/datum/controller/subsystem/holomaps/proc/generateHoloMinimap(var/zLevel = 1)
|
||||
// Save these values now to avoid a bazillion array lookups
|
||||
var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zLevel)
|
||||
var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zLevel)
|
||||
@@ -87,7 +77,7 @@ var/global/list/extraMiniMaps = list()
|
||||
// This seems to do the drawing thing, but draws only the areas, having nothing to do with the tiles.
|
||||
// Leshana: I'm guessing this map will get overlayed on top of the base map at runtime? We'll see.
|
||||
// Wait, seems we actually blend the area map on top of it right now! Huh.
|
||||
/proc/generateStationMinimap(var/zLevel)
|
||||
/datum/controller/subsystem/holomaps/proc/generateStationMinimap(var/zLevel)
|
||||
// Save these values now to avoid a bazillion array lookups
|
||||
var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zLevel)
|
||||
var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zLevel)
|
||||
@@ -134,7 +124,7 @@ var/global/list/extraMiniMaps = list()
|
||||
extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[zLevel]"] = actual_small_map
|
||||
|
||||
// For tiny multi-z maps like the tether, we want to smoosh em together into a nice big one!
|
||||
/proc/smooshTetherHolomaps(var/list/zlevels)
|
||||
/datum/controller/subsystem/holomaps/proc/smooshTetherHolomaps(var/list/zlevels)
|
||||
var/icon/big_map = icon(HOLOMAP_ICON, "stationmap")
|
||||
var/icon/small_map = icon(HOLOMAP_ICON, "blank")
|
||||
// For each zlevel in turn, overlay them on top of each other
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
/datum/station_holomap/proc/initialize_holomap(var/turf/T, var/isAI = null, var/mob/user = null, var/reinit = FALSE)
|
||||
if(!station_map || reinit)
|
||||
station_map = image(extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAP]_[T.z]"])
|
||||
station_map = image(SSholomaps.extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAP]_[T.z]"])
|
||||
if(!cursor || reinit)
|
||||
cursor = image('icons/holomap_markers_vr.dmi', "you")
|
||||
if(!legend || reinit)
|
||||
@@ -33,7 +33,7 @@
|
||||
// TODO - Strategic Holomap support
|
||||
// /datum/station_holomap/strategic/initialize_holomap(var/turf/T, var/isAI=null, var/mob/user=null)
|
||||
// ..()
|
||||
// station_map = image(extraMiniMaps[HOLOMAP_EXTRA_STATIONMAP_STRATEGIC])
|
||||
// station_map = image(SSholomaps.extraMiniMaps[HOLOMAP_EXTRA_STATIONMAP_STRATEGIC])
|
||||
// legend = image('icons/effects/64x64.dmi', "strategic")
|
||||
// legend.pixel_x = 3*WORLD_ICON_SIZE
|
||||
// legend.pixel_y = 3*WORLD_ICON_SIZE
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
var/global/list/station_holomaps = list()
|
||||
|
||||
//
|
||||
// Wall mounted holomap of the station
|
||||
//
|
||||
/obj/machinery/station_map
|
||||
name = "station holomap"
|
||||
desc = "A virtual map of the surrounding station."
|
||||
@@ -10,7 +11,6 @@ var/global/list/station_holomaps = list()
|
||||
use_power = 1
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 500
|
||||
//auto_init = 0 // We handle our own special initialization needs. // TODO - Make this not ~Leshana
|
||||
circuit = /obj/item/weapon/circuitboard/station_map
|
||||
|
||||
// TODO - Port use_auto_lights from /vg - for now declare here
|
||||
@@ -34,17 +34,17 @@ var/global/list/station_holomaps = list()
|
||||
..()
|
||||
holomap_datum = new()
|
||||
original_zLevel = loc.z
|
||||
station_holomaps += src
|
||||
SSholomaps.station_holomaps += src
|
||||
flags |= ON_BORDER // Why? It doesn't help if its not density
|
||||
|
||||
/obj/machinery/station_map/initialize()
|
||||
. = ..()
|
||||
if(ticker && holomaps_initialized)
|
||||
if(SSholomaps.holomaps_initialized)
|
||||
spawn(1) // Tragically we need to spawn this in order to give the frame construcing us time to set pixel_x/y
|
||||
setup_holomap()
|
||||
|
||||
/obj/machinery/station_map/Destroy()
|
||||
station_holomaps -= src
|
||||
SSholomaps.station_holomaps -= src
|
||||
stopWatching()
|
||||
holomap_datum = null
|
||||
. = ..()
|
||||
@@ -54,7 +54,7 @@ var/global/list/station_holomaps = list()
|
||||
bogus = FALSE
|
||||
var/turf/T = get_turf(src)
|
||||
original_zLevel = T.z
|
||||
if(!("[HOLOMAP_EXTRA_STATIONMAP]_[original_zLevel]" in extraMiniMaps))
|
||||
if(!("[HOLOMAP_EXTRA_STATIONMAP]_[original_zLevel]" in SSholomaps.extraMiniMaps))
|
||||
bogus = TRUE
|
||||
holomap_datum.initialize_holomap_bogus()
|
||||
update_icon()
|
||||
@@ -62,7 +62,7 @@ var/global/list/station_holomaps = list()
|
||||
|
||||
holomap_datum.initialize_holomap(T, reinit = TRUE)
|
||||
|
||||
small_station_map = image(extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"], dir = dir)
|
||||
small_station_map = image(SSholomaps.extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"], dir = dir)
|
||||
// small_station_map.plane = LIGHTING_PLANE // Not until we do planes ~Leshana
|
||||
// small_station_map.layer = LIGHTING_LAYER+1 // Weird things will happen!
|
||||
|
||||
@@ -182,7 +182,7 @@ var/global/list/station_holomaps = list()
|
||||
if(bogus)
|
||||
holomap_datum.initialize_holomap_bogus()
|
||||
else
|
||||
small_station_map.icon = extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"]
|
||||
small_station_map.icon = SSholomaps.extraMiniMaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"]
|
||||
overlays |= small_station_map
|
||||
holomap_datum.initialize_holomap(get_turf(src))
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
/obj/item/seeds/limeseed = 3,
|
||||
/obj/item/seeds/mtearseed = 2,
|
||||
/obj/item/seeds/orangeseed = 3,
|
||||
/obj/item/seeds/onionseed = 3,
|
||||
/obj/item/seeds/peanutseed = 3,
|
||||
/obj/item/seeds/plumpmycelium = 3,
|
||||
/obj/item/seeds/poppyseed = 3,
|
||||
|
||||
@@ -68,6 +68,18 @@
|
||||
name = "stack of wood"
|
||||
type_to_spawn = /obj/item/stack/material/wood
|
||||
|
||||
/obj/fiftyspawner/sifwood
|
||||
name = "stack of alien wood"
|
||||
type_to_spawn = /obj/item/stack/material/wood/sif
|
||||
|
||||
/obj/fiftyspawner/log
|
||||
name = "stack of logs"
|
||||
type_to_spawn = /obj/item/stack/material/log
|
||||
|
||||
/obj/fiftyspawner/log
|
||||
name = "stack of alien logs"
|
||||
type_to_spawn = /obj/item/stack/material/log/sif
|
||||
|
||||
/obj/fiftyspawner/cloth
|
||||
name = "stack of cloth"
|
||||
type_to_spawn = /obj/item/stack/material/cloth
|
||||
|
||||
@@ -186,6 +186,6 @@
|
||||
|
||||
/material/wood/sif/generate_recipes()
|
||||
..()
|
||||
recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/sifwood, 1, 4, 20)
|
||||
recipes += new/datum/stack_recipe("alien wood floor tile", /obj/item/stack/tile/wood/sif, 1, 4, 20)
|
||||
recipes -= new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
|
||||
recipes -= new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)
|
||||
|
||||
@@ -667,6 +667,12 @@ var/list/name_to_material
|
||||
icon_base = "dungeon"
|
||||
icon_colour = "#FFFFFF"
|
||||
|
||||
/material/alienalloy/bedrock
|
||||
name = "bedrock"
|
||||
display_name = "impassable rock"
|
||||
icon_base = "rock"
|
||||
icon_colour = "#FFFFFF"
|
||||
|
||||
/material/alienalloy/alium
|
||||
name = "alium"
|
||||
display_name = "alien"
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
var/supported = 0
|
||||
var/active = 0
|
||||
var/list/resource_field = list()
|
||||
var/obj/item/device/radio/intercom/faultreporter = new /obj/item/device/radio/intercom{channels=list("Supply")}(null)
|
||||
|
||||
var/ore_types = list(
|
||||
"hematite" = /obj/item/weapon/ore/iron,
|
||||
@@ -60,7 +61,7 @@
|
||||
if(!active) return
|
||||
|
||||
if(!anchored || !use_cell_power())
|
||||
system_error("system configuration or charge error")
|
||||
system_error("System configuration or charge error.")
|
||||
return
|
||||
|
||||
if(need_update_field)
|
||||
@@ -85,7 +86,10 @@
|
||||
harvesting.has_resources = 0
|
||||
harvesting.resources = null
|
||||
resource_field -= harvesting
|
||||
harvesting = pick(resource_field)
|
||||
if(resource_field.len) // runtime protection
|
||||
harvesting = pick(resource_field)
|
||||
else
|
||||
harvesting = null
|
||||
|
||||
if(!harvesting) return
|
||||
|
||||
@@ -95,7 +99,7 @@
|
||||
for(var/metal in ore_types)
|
||||
|
||||
if(contents.len >= capacity)
|
||||
system_error("insufficient storage space")
|
||||
system_error("Insufficient storage space.")
|
||||
active = 0
|
||||
need_player_check = 1
|
||||
update_icon()
|
||||
@@ -131,12 +135,19 @@
|
||||
active = 0
|
||||
need_player_check = 1
|
||||
update_icon()
|
||||
system_error("Resources depleted.")
|
||||
|
||||
/obj/machinery/mining/drill/attack_ai(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/mining/drill/attackby(obj/item/O as obj, mob/user as mob)
|
||||
if(!active)
|
||||
if(istype(O, /obj/item/device/multitool))
|
||||
var/newtag = text2num(sanitizeSafe(input(user, "Enter new ID number or leave empty to cancel.", "Assign ID number") as text, 4))
|
||||
if(newtag)
|
||||
name = "[initial(name)] #[newtag]"
|
||||
to_chat(user, "<span class='notice'>You changed the drill ID to: [newtag]</span>")
|
||||
return
|
||||
if(default_deconstruction_screwdriver(user, O))
|
||||
return
|
||||
if(default_deconstruction_crowbar(user, O))
|
||||
@@ -234,6 +245,7 @@
|
||||
|
||||
if(error)
|
||||
src.visible_message("<span class='notice'>\The [src] flashes a '[error]' warning.</span>")
|
||||
faultreporter.autosay(error, src.name, "Supply")
|
||||
need_player_check = 1
|
||||
active = 0
|
||||
update_icon()
|
||||
|
||||
@@ -5,6 +5,7 @@ var/list/mining_overlay_cache = list()
|
||||
name = "impassable rock"
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
icon_state = "rock-dark"
|
||||
density = 1
|
||||
|
||||
/turf/simulated/mineral //wall piece
|
||||
name = "rock"
|
||||
|
||||
@@ -753,7 +753,7 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
|
||||
return 0
|
||||
var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null)
|
||||
if(msg)
|
||||
log_say("SpectralWhisper: [key_name(usr)]->[M.key] : [msg]")
|
||||
log_say("(SPECWHISP to [key_name(M)]): [msg]", src)
|
||||
M << "<span class='warning'> You hear a strange, unidentifiable voice in your head... <font color='purple'>[msg]</font></span>"
|
||||
src << "<span class='warning'> You said: '[msg]' to [M].</span>"
|
||||
else
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
if (!message)
|
||||
return
|
||||
|
||||
log_say("Ghost/[src.key] : [message]")
|
||||
log_ghostsay(message, src)
|
||||
|
||||
if (src.client)
|
||||
if(message)
|
||||
@@ -25,7 +25,7 @@
|
||||
if(act != "me")
|
||||
return
|
||||
|
||||
log_emote("Ghost/[src.key] : [message]")
|
||||
log_ghostemote(message, src)
|
||||
|
||||
if(src.client)
|
||||
if(message)
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
|
||||
if(stat == DEAD)
|
||||
return 0
|
||||
if(src.loc && istype(loc,/mob/living)) deathmessage = "no message" //VOREStation Add - Prevents death messages from inside mobs
|
||||
if(src.loc && istype(loc,/obj/belly)) deathmessage = "no message" //VOREStation Add - Prevents death messages from inside mobs
|
||||
facing_dir = null
|
||||
|
||||
if(!gibbed && deathmessage != "no message") // This is gross, but reliable. Only brains use it.
|
||||
|
||||
@@ -15,14 +15,13 @@
|
||||
else
|
||||
input = message
|
||||
if(input)
|
||||
log_emote(message,src) //Log before we add junk
|
||||
message = "<B>[src]</B> [input]"
|
||||
else
|
||||
return
|
||||
|
||||
|
||||
if (message)
|
||||
log_emote("[name]/[key] : [message]")
|
||||
|
||||
message = say_emphasis(message)
|
||||
|
||||
// Hearing gasp and such every five seconds is not good emotes were not global for a reason.
|
||||
@@ -78,7 +77,7 @@
|
||||
input = say_emphasis(input)
|
||||
|
||||
if(input)
|
||||
log_emote("Ghost/[src.key] : [input]")
|
||||
log_ghostemote(input, src)
|
||||
if(!invisibility) //If the ghost is made visible by admins or cult. And to see if the ghost has toggled its own visibility, as well. -Mech
|
||||
visible_message("<span class='deadsay'><B>[src]</B> [input]</span>")
|
||||
else
|
||||
|
||||
@@ -209,7 +209,7 @@ var/list/slot_equipment_priority = list( \
|
||||
if(target)
|
||||
I.forceMove(target)
|
||||
else
|
||||
I.dropInto(loc)
|
||||
I.dropInto(drop_location())
|
||||
I.dropped(src)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
// Galactic common languages (systemwide accepted standards).
|
||||
/datum/language/trader
|
||||
name = LANGUAGE_TRADEBAND
|
||||
desc = "Maintained by the various trading cartels in major systems, this elegant, structured language is used for bartering and bargaining."
|
||||
desc = "Maintained by the various trading cartels in major systems, this elegant, structured language is used for bartering and bargaining." //VOREstation Edit
|
||||
speech_verb = "enunciates"
|
||||
colour = "say_quote"
|
||||
key = "2"
|
||||
@@ -53,10 +53,22 @@
|
||||
"nt","ti","us","it","en","at","tu","te","ri","es","et","ra","ta","an","ni","li","on","or","se",
|
||||
"am","ae","ia","di","ue","em","ar","ui","st","si","de","ci","iu","ne","pe","co","os","ur","ru")
|
||||
|
||||
/datum/language/terminus
|
||||
name = LANGUAGE_TERMINUS
|
||||
desc = "A soft language spoken by the people of the sparsely populated, socially-conscious Precursors' Crypt region."
|
||||
speech_verb = "mentions"
|
||||
exclaim_verb = "insinuates"
|
||||
colour = "terminus"
|
||||
key = "4"
|
||||
flags = WHITELISTED
|
||||
syllables = list ("die", "en", "skei", "van", "son", "der", "aar", "ch", "op", "ruk", "aa", "be", "ne", "het",
|
||||
"ek", "ras", "ver", "zan", "das", "waa", "geb", "vol", "lu", "min", "breh", "rus", "stv", "ee", "goe", "sk",
|
||||
"la", "ver", "we", "ge", "luk", "an", "ar", "at", "es", "et", "bel", "du", "jaa", "ch", "kk", "gh", "ll", "uu", "wat")
|
||||
|
||||
// Criminal language.
|
||||
/datum/language/gutter
|
||||
name = LANGUAGE_GUTTER
|
||||
desc = "There is no true language named Gutter. 'Gutter' is a catchall term for a collection of unofficial SolCom dialects that has somehow managed to spread across the stars."
|
||||
desc = "Gutter originated as a Thieves' Cant of sorts during the early colonization era. The language eventually spread from the cartels and triads to the disenfranchised people of the Bowl."
|
||||
speech_verb = "growls"
|
||||
colour = "rough"
|
||||
key = "3"
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
return (copytext(message, length(message)) == "!") ? 2 : 1
|
||||
|
||||
/datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
|
||||
log_say("[key_name(speaker)] : ([name]) [message]")
|
||||
log_say("(HIVE) [message]", src)
|
||||
|
||||
if(!speaker_mask) speaker_mask = speaker.name
|
||||
message = format_message(message, get_spoken_verb(message))
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
speech_verb = "hisses"
|
||||
ask_verb = "hisses"
|
||||
exclaim_verb = "hisses"
|
||||
key = "4"
|
||||
key = "u"
|
||||
flags = RESTRICTED
|
||||
syllables = list("sss","sSs","SSS")
|
||||
|
||||
@@ -115,3 +115,18 @@
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
//for your antag purposes.
|
||||
/datum/language/minbus
|
||||
name = LANGUAGE_MINBUS
|
||||
desc = "The Powers That Be have seen it fit to grace you with a special language that sounds like Russian for some reason."
|
||||
speech_verb = "says"
|
||||
ask_verb = "asks"
|
||||
exclaim_verb = "shouts"
|
||||
colour = "deadsay"
|
||||
key = "r"
|
||||
machine_understands = 0
|
||||
flags = RESTRICTED
|
||||
syllables = list("rus","zem","ave","groz","ski","ska","ven","konst","pol","lin","svy",
|
||||
"danya","da","mied","zan","das","krem","myka","cyka","blyat","to","st","no","na","ni",
|
||||
"ko","ne","en","po","ra","li","on","byl","cto","eni","ost","ol","ego","ver","stv","pro")
|
||||
@@ -85,6 +85,20 @@
|
||||
flags = WHITELISTED
|
||||
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix")
|
||||
|
||||
/datum/language/skrellfar
|
||||
name = LANGUAGE_SKRELLIANFAR
|
||||
desc = "The most common language among the Skrellian Far Kingdoms. Has an even higher than usual concentration of inaudible phonemes."
|
||||
speech_verb = "warbles"
|
||||
ask_verb = "warbles"
|
||||
exclaim_verb = "sings"
|
||||
whisper_verb = "hums"
|
||||
colour = "skrellfar"
|
||||
key = "p"
|
||||
space_chance = 30
|
||||
flags = WHITELISTED
|
||||
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix", "...", "oo", "q", "nq", "x", "xq", "ll", "...", "...", "...") //should sound like there's holes in it
|
||||
|
||||
|
||||
/datum/language/human
|
||||
name = LANGUAGE_SOL_COMMON
|
||||
desc = "A bastardized hybrid of many languages, including Chinese, English, French, and more; it is the common language of the Sol system."
|
||||
@@ -114,7 +128,7 @@
|
||||
|
||||
/datum/language/machine
|
||||
name = LANGUAGE_EAL
|
||||
desc = "An efficient language of encoded tones developed by synthetics and cyborgs."
|
||||
desc = "An efficient language of encoded tones developed by positronics."
|
||||
speech_verb = "whistles"
|
||||
ask_verb = "chirps"
|
||||
exclaim_verb = "whistles loudly"
|
||||
@@ -244,4 +258,4 @@
|
||||
"tod", "ser", "su", "no", "nue", "el",
|
||||
"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na",
|
||||
"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un",
|
||||
"tod", "ser", "su", "no", "nue", "el")
|
||||
"tod", "ser", "su", "no", "nue", "el")
|
||||
@@ -119,7 +119,7 @@
|
||||
else
|
||||
src << text("Invalid Emote: []", act)
|
||||
if ((message && src.stat == 0))
|
||||
log_emote("[name]/[key] : [message]")
|
||||
log_emote(message, src)
|
||||
if (m_type & 1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(message, m_type)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
use_me = 0 //Can't use the me verb, it's a freaking immobile brain
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "brain1"
|
||||
no_vore = TRUE //VOREStation Edit - PLEASE. lol.
|
||||
|
||||
New()
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
src << "<font color='blue'>Unusable emote '[act]'. Say *help for a list.</font>"
|
||||
|
||||
if (message)
|
||||
log_emote("[name]/[key] : [message]")
|
||||
log_emote(message, src)
|
||||
|
||||
for(var/mob/M in dead_mob_list)
|
||||
if (!M.client || istype(M, /mob/new_player))
|
||||
|
||||
@@ -101,9 +101,8 @@
|
||||
G.last_action = world.time
|
||||
flick(G.hud.icon_state, G.hud)
|
||||
|
||||
user.attack_log += "\[[time_stamp()]\]<font color='red'> Knifed [name] ([ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])</font>"
|
||||
src.attack_log += "\[[time_stamp()]\]<font color='orange'> Got knifed by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])</font>"
|
||||
msg_admin_attack("[key_name(user)] knifed [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" )
|
||||
add_attack_logs(user,src,"Knifed (throat slit)")
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/proc/shank_attack(obj/item/W, obj/item/weapon/grab/G, mob/user, hit_zone)
|
||||
@@ -119,9 +118,7 @@
|
||||
if(W.hitsound)
|
||||
playsound(loc, W.hitsound, 50, 1, -1)
|
||||
|
||||
user.attack_log += "\[[time_stamp()]\]<font color='red'> Shanked [name] ([ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])</font>"
|
||||
src.attack_log += "\[[time_stamp()]\]<font color='orange'> Got shanked by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])</font>"
|
||||
msg_admin_attack("[key_name(user)] shanked [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" )
|
||||
add_attack_logs(user,src,"Knifed (shanked)")
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
@@ -729,10 +729,8 @@
|
||||
src << "<font color='blue'>Unusable emote '[act]'. Say *help for a list.</font>"
|
||||
|
||||
if (message)
|
||||
log_emote("[name]/[key] : [message]")
|
||||
custom_emote(m_type,message)
|
||||
|
||||
|
||||
/mob/living/carbon/human/verb/pose()
|
||||
set name = "Set Pose"
|
||||
set desc = "Sets a description which will be shown when someone examines you."
|
||||
|
||||
@@ -66,7 +66,6 @@
|
||||
log_and_message_admins("broke their [breaking] with *flip, ahahah.", src)
|
||||
|
||||
if (message)
|
||||
log_emote("[name]/[key] : [message]")
|
||||
custom_emote(m_type,message)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -302,7 +302,7 @@
|
||||
msg += attempt_vr(src,"examine_bellies",args) //VOREStation Code
|
||||
msg += attempt_vr(src,"examine_pickup_size",args) //VOREStation Code
|
||||
msg += attempt_vr(src,"examine_step_size",args) //VOREStation Code
|
||||
msg += attempt_vr(src,"nif_examine",args) //VOREStation Code
|
||||
msg += attempt_vr(src,"examine_nif",args) //VOREStation Code
|
||||
|
||||
if(mSmallsize in mutations)
|
||||
msg += "[T.He] [T.is] small halfling!\n"
|
||||
|
||||
@@ -107,17 +107,6 @@
|
||||
message = "<span class='warning'>[t_He] [t_is] so absolutely stuffed that you aren't sure how it's possible to move. [t_He] can't seem to swell any bigger. The surface of [t_his] belly looks sorely strained!</span>\n"
|
||||
return message
|
||||
|
||||
/mob/living/carbon/human/proc/examine_bellies()
|
||||
if(!show_pudge()) //Some clothing or equipment can hide this.
|
||||
return ""
|
||||
|
||||
var/message = ""
|
||||
for (var/I in src.vore_organs)
|
||||
var/datum/belly/B = vore_organs[I]
|
||||
message += B.get_examine_msg()
|
||||
|
||||
return message
|
||||
|
||||
//For OmniHUD records access for appropriate models
|
||||
/proc/hasHUD_vr(mob/living/carbon/human/H, hudtype)
|
||||
if(H.nif)
|
||||
@@ -141,23 +130,18 @@
|
||||
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/human/proc/examine_pickup_size(mob/living/carbon/human/H)
|
||||
/mob/living/carbon/human/proc/examine_pickup_size(mob/living/H)
|
||||
var/message = ""
|
||||
if(isliving(src) && (H.get_effective_size() - src.get_effective_size()) >= 0.50)
|
||||
if(istype(H) && (H.get_effective_size() - src.get_effective_size()) >= 0.50)
|
||||
message = "<font color='blue'>They are small enough that you could easily pick them up!</font>\n"
|
||||
return message
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/examine_step_size(mob/living/carbon/human/H)
|
||||
/mob/living/carbon/human/proc/examine_step_size(mob/living/H)
|
||||
var/message = ""
|
||||
if(isliving(src) && (H.get_effective_size() - src.get_effective_size()) >= 0.75)
|
||||
if(istype(H) && (H.get_effective_size() - src.get_effective_size()) >= 0.75)
|
||||
message = "<font color='red'>They are small enough that you could easily trample them!</font>\n"
|
||||
return message
|
||||
|
||||
/mob/living/carbon/human/proc/nif_examine(mob/living/carbon/human/H)
|
||||
var/message = ""
|
||||
if(!src.nif || src.conceal_nif || !src.nif_examine) //Do they have a nif, do they have the NIF concealed, and do they have a NIF examine message?
|
||||
return "" //If so, no message.
|
||||
else
|
||||
message += "[src.nif_examine]\n"
|
||||
return message
|
||||
/mob/living/carbon/human/proc/examine_nif(mob/living/carbon/human/H)
|
||||
if(nif && nif.examine_msg) //If you have one set, anyway.
|
||||
return "<span class='notice'>[nif.examine_msg]</span>\n"
|
||||
|
||||
@@ -66,7 +66,8 @@
|
||||
list_body = null
|
||||
LAZYCLEARLIST(list_huds)
|
||||
list_huds = null
|
||||
if(nif) qdel_null(nif) //VOREStation Add
|
||||
qdel_null(nif) //VOREStation Add
|
||||
qdel_null_list(vore_organs) //VOREStation Add
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/Stat()
|
||||
@@ -895,7 +896,7 @@
|
||||
else
|
||||
target.show_message("<font color='blue'> You hear a voice that seems to echo around the room: [say]</font>")
|
||||
usr.show_message("<font color='blue'> You project your mind into [target.real_name]: [say]</font>")
|
||||
log_say("[key_name(usr)] sent a telepathic message to [key_name(target)]: [say]")
|
||||
log_say("(TPATH to [key_name(target)]) [say]",src)
|
||||
for(var/mob/observer/dead/G in world)
|
||||
G.show_message("<i>Telepathic message from <b>[src]</b> to <b>[target]</b>: [say]</i>")
|
||||
|
||||
@@ -1556,13 +1557,13 @@
|
||||
return species.fire_icon_state
|
||||
|
||||
// Called by job_controller. Makes drones start with a permit, might be useful for other people later too.
|
||||
/mob/living/carbon/human/equip_post_job() //Drone Permit moved to equip_survival_gear()
|
||||
/mob/living/carbon/human/equip_post_job()
|
||||
var/braintype = get_FBP_type()
|
||||
if(braintype == FBP_DRONE)
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/item/clothing/accessory/permit/drone/permit = new(T)
|
||||
permit.set_name(real_name)
|
||||
equip_to_appropriate_slot(permit) // If for some reason it can't find room, it'll still be on the floor.
|
||||
equip_to_slot_or_del(permit, slot_in_backpack)
|
||||
|
||||
/mob/living/carbon/human/proc/update_icon_special(var/mutable_appearance/ma, var/update_icons = TRUE) //For things such as teshari hiding and whatnot.
|
||||
if(hiding) // Hiding? Carry on.
|
||||
@@ -1574,4 +1575,4 @@
|
||||
//Can put special species icon update proc calls here, if any are ever invented.
|
||||
|
||||
if(update_icons)
|
||||
update_icons()
|
||||
update_icons()
|
||||
|
||||
@@ -251,9 +251,8 @@
|
||||
H.visible_message("<span class='danger'>[attack_message]</span>")
|
||||
|
||||
playsound(loc, ((miss_type) ? (miss_type == 1 ? attack.miss_sound : 'sound/weapons/thudswoosh.ogg') : attack.attack_sound), 25, 1, -1)
|
||||
H.attack_log += text("\[[time_stamp()]\] <font color='red'>[miss_type ? (miss_type == 1 ? "Missed" : "Blocked") : "[pick(attack.attack_verb)]"] [src.name] ([src.ckey])</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>[miss_type ? (miss_type == 1 ? "Was missed by" : "Has blocked") : "Has Been [pick(attack.attack_verb)]"] by [H.name] ([H.ckey])</font>")
|
||||
msg_admin_attack("[key_name(H)] [miss_type ? (miss_type == 1 ? "has missed" : "was blocked by") : "has [pick(attack.attack_verb)]"] [key_name(src)]")
|
||||
|
||||
add_attack_logs(H,src,"Melee attacked with fists (miss/block)")
|
||||
|
||||
if(miss_type)
|
||||
return 0
|
||||
@@ -284,10 +283,8 @@
|
||||
apply_damage(real_damage, hit_dam_type, hit_zone, armour, soaked, sharp=attack.sharp, edge=attack.edge)
|
||||
|
||||
if(I_DISARM)
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Disarmed [src.name] ([src.ckey])</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been disarmed by [M.name] ([M.ckey])</font>")
|
||||
add_attack_logs(H,src,"Disarmed")
|
||||
|
||||
msg_admin_attack("[key_name(M)] disarmed [src.name] ([src.ckey])")
|
||||
M.do_attack_animation(src)
|
||||
|
||||
if(w_uniform)
|
||||
@@ -349,8 +346,7 @@
|
||||
if(!damage)
|
||||
return
|
||||
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name] ([src.ckey])</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>was attacked by [user.name] ([user.ckey])</font>")
|
||||
add_attack_logs(user,src,"Melee attacked with fists (miss/block)",admin_notify = FALSE) //No admin notice since this is usually fighting simple animals
|
||||
src.visible_message("<span class='danger'>[user] has [attack_message] [src]!</span>")
|
||||
user.do_attack_animation(src)
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ emp_act
|
||||
c_hand = r_hand
|
||||
|
||||
if(c_hand && (stun_amount || agony_amount > 10))
|
||||
msg_admin_attack("[src.name] ([src.ckey]) was disarmed by a stun effect")
|
||||
msg_admin_attack("[key_name(src)] was disarmed by a stun effect")
|
||||
|
||||
drop_from_inventory(c_hand)
|
||||
if (affected.robotic >= ORGAN_ROBOT)
|
||||
@@ -403,13 +403,7 @@ emp_act
|
||||
src.visible_message("<font color='red'>[src] has been hit in the [hit_area] by [O].</font>")
|
||||
|
||||
if(ismob(O.thrower))
|
||||
var/mob/M = O.thrower
|
||||
var/client/assailant = M.client
|
||||
if(assailant)
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a [O], thrown by [M.name] ([assailant.ckey])</font>")
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with a thrown [O]</font>")
|
||||
if(!istype(src,/mob/living/simple_animal/mouse))
|
||||
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
|
||||
add_attack_logs(O.thrower,src,"Hit with thrown [O.name]")
|
||||
|
||||
//If the armor absorbs all of the damage, skip the rest of the calculations
|
||||
var/soaked = get_armor_soak(affecting, "melee", O.armor_penetration)
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
var/obj/item/organ/external/E = get_organ(organ_name)
|
||||
if(!E || E.is_stump())
|
||||
tally += 4
|
||||
else if(E.splinted)
|
||||
else if(E.splinted && E.splinted.loc != E)
|
||||
tally += 0.5
|
||||
else if(E.status & ORGAN_BROKEN)
|
||||
tally += 1.5
|
||||
@@ -55,7 +55,7 @@
|
||||
var/obj/item/organ/external/E = get_organ(organ_name)
|
||||
if(!E || E.is_stump())
|
||||
tally += 4
|
||||
else if(E.splinted)
|
||||
else if(E.splinted && E.splinted.loc != E)
|
||||
tally += 0.5
|
||||
else if(E.status & ORGAN_BROKEN)
|
||||
tally += 1.5
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
src << "Not even a [src.species.name] can speak to the dead."
|
||||
return
|
||||
|
||||
log_say("[key_name(src)] communed to [key_name(M)]: [text]")
|
||||
log_say("(COMMUNE to [key_name(M)]) [text]",src)
|
||||
|
||||
M << "<font color='blue'>Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]</font>"
|
||||
if(istype(M,/mob/living/carbon/human))
|
||||
@@ -104,7 +104,7 @@
|
||||
|
||||
var/msg = sanitize(input("Message:", "Psychic Whisper") as text|null)
|
||||
if(msg)
|
||||
log_say("PsychicWhisper: [key_name(src)]->[M.key] : [msg]")
|
||||
log_say("(PWHISPER to [key_name(M)]) [msg]", src)
|
||||
M << "<font color='green'>You hear a strange, alien voice in your head... <i>[msg]</i></font>"
|
||||
src << "<font color='green'>You said: \"[msg]\" to [M]</font>"
|
||||
return
|
||||
@@ -173,7 +173,7 @@
|
||||
|
||||
for(var/obj/item/organ/external/EO in organs)
|
||||
if(EO.brute_dam || EO.burn_dam)
|
||||
output += "[EO.name] - <span class='warning'>[EO.burn_dam + EO.brute_dam > ROBOLIMB_REPAIR_CAP ? "Heavy Damage" : "Light Damage"]</span>\n"
|
||||
output += "[EO.name] - <span class='warning'>[EO.burn_dam + EO.brute_dam > EO.min_broken_damage ? "Heavy Damage" : "Light Damage"]</span>\n" //VOREStation Edit - Makes robotic limb damage scalable
|
||||
else
|
||||
output += "[EO.name] - <span style='color:green;'>OK</span>\n"
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
/mob/living/carbon/human/dummy
|
||||
no_vore = TRUE //Dummies don't need bellies.
|
||||
|
||||
/mob/living/carbon/human/sergal/New(var/new_loc)
|
||||
h_style = "Sergal Plain"
|
||||
..(new_loc, "Sergal")
|
||||
|
||||
@@ -319,7 +319,7 @@ This saves us from having to call add_fingerprint() any time something is put in
|
||||
for(var/obj/item/clothing/C in worn_clothing)
|
||||
if(istype(W, /obj/item/clothing/accessory))
|
||||
var/obj/item/clothing/accessory/A = W
|
||||
if(C.attempt_attach_accessory(A))
|
||||
if(C.attempt_attach_accessory(A, src))
|
||||
return
|
||||
else
|
||||
src << "<font color='red'>You are trying to equip this item to an unsupported inventory slot. How the heck did you manage that? Stop it...</font>"
|
||||
|
||||
@@ -901,6 +901,11 @@
|
||||
if(overeatduration > 1)
|
||||
overeatduration -= 2 //doubled the unfat rate
|
||||
|
||||
if(noisy == TRUE && nutrition < 250 && prob(10)) //VOREStation edit for hunger noises.
|
||||
var/growlsound = pick(hunger_sounds)
|
||||
var/growlmultiplier = 100 - (nutrition / 250 * 100)
|
||||
playsound(src, growlsound, vol = growlmultiplier, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises)
|
||||
|
||||
if(!isSynthetic() && (species.flags & IS_PLANT) && (!light_organ || light_organ.is_broken()))
|
||||
if(nutrition < 200)
|
||||
take_overall_damage(2,0)
|
||||
|
||||
@@ -156,9 +156,9 @@ VOREStation Removal End */
|
||||
H.adjustFireLoss(-heal_rate)
|
||||
H.adjustOxyLoss(-heal_rate)
|
||||
H.adjustToxLoss(-heal_rate)
|
||||
else
|
||||
/* else //VOREStation Edit Start.
|
||||
H.adjustToxLoss(2*heal_rate) // Doubled because 0.5 is miniscule, and fire_stacks are capped in both directions
|
||||
|
||||
*/ //VOREStation Edit End
|
||||
/datum/species/shapeshifter/promethean/get_blood_colour(var/mob/living/carbon/human/H)
|
||||
return (H ? rgb(H.r_skin, H.g_skin, H.b_skin) : ..())
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
worlds tumultous at best."
|
||||
num_alternate_languages = 3
|
||||
species_language = LANGUAGE_SOL_COMMON
|
||||
secondary_langs = list(LANGUAGE_SOL_COMMON)
|
||||
secondary_langs = list(LANGUAGE_SOL_COMMON, LANGUAGE_TERMINUS)
|
||||
name_language = null // Use the first-name last-name generator rather than a language scrambler
|
||||
min_age = 17
|
||||
max_age = 130
|
||||
|
||||
+116
-105
@@ -437,9 +437,7 @@
|
||||
C.absorbing_prey = 0
|
||||
to_chat(C, "<span class='notice'>You have completely drained [T], causing them to pass out.</span>")
|
||||
to_chat(T, "<span class='danger'>You feel weak, as if you have no control over your body whatsoever as [C] finishes draining you.!</span>")
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was drained by [key_name(C)]</font>")
|
||||
C.attack_log += text("\[[time_stamp()]\] <font color='orange'> Drained [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was completely drained of all nutrition by [key_name(C)]")
|
||||
add_attack_logs(C,T,"Succubus drained")
|
||||
return
|
||||
|
||||
if(!do_mob(src, T, 50) || G.state != GRAB_NECK) //One drain tick every 5 seconds.
|
||||
@@ -516,9 +514,7 @@
|
||||
absorbing_prey = 0
|
||||
to_chat(src, "<span class='notice'>You have completely drained [T], killing them.</span>")
|
||||
to_chat(T, "<span class='danger'size='5'>You feel... So... Weak...</span>")
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was drained by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Drained [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was completely drained of all nutrition by [key_name(src)]")
|
||||
add_attack_logs(src,T,"Succubus drained (almost lethal)")
|
||||
return
|
||||
if(drain_finalized == 1 || T.getBrainLoss() < 55) //Let's not kill them with this unless the drain is finalized. This will still stack up to 55, since 60 is lethal.
|
||||
T.adjustBrainLoss(5) //Will kill them after a short bit!
|
||||
@@ -533,9 +529,7 @@
|
||||
to_chat(src, "<span class='notice'>You have completely drained [T], killing them in the process.</span>")
|
||||
to_chat(T, "<span class='danger'><font size='7'>You... Feel... So... Weak...</font></span>")
|
||||
visible_message("<span class='danger'>[src] seems to finish whatever they were doing to [T].</span>")
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was drained by [key_name(src)]</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'> Drained [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(T)] was completely drained of all nutrition by [key_name(src)]")
|
||||
add_attack_logs(src,T,"Succubus drained (lethal)")
|
||||
return
|
||||
|
||||
if(!do_mob(src, T, 50) || G.state != GRAB_NECK) //One drain tick every 5 seconds.
|
||||
@@ -595,9 +589,7 @@
|
||||
C.absorbing_prey = 0
|
||||
to_chat(C, "<span class='danger'>You have completely fed [T] every part of your body!</span>")
|
||||
to_chat(T, "<span class='notice'>You feel quite strong and well fed, as [C] finishes feeding \himself to you!</span>")
|
||||
T.attack_log += text("\[[time_stamp()]\] <font color='red'>Was fed via slime feed by [key_name(C)]</font>")
|
||||
C.attack_log += text("\[[time_stamp()]\] <font color='orange'> Fed via slime feed [key_name(T)]</font>")
|
||||
msg_admin_attack("[key_name(C)] fed [key_name(T)] via slime feed, resulting in them being eaten!")
|
||||
add_attack_logs(C,T,"Slime fed")
|
||||
C.feed_grabbed_to_self_falling_nom(T,C) //Reused this proc instead of making a new one to cut down on code usage.
|
||||
return
|
||||
|
||||
@@ -606,9 +598,6 @@
|
||||
C.absorbing_prey = 0
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/succubus_drain_finalize()
|
||||
set name = "Drain/Feed Finalization"
|
||||
set desc = "Toggle to allow for draining to be prolonged. Turn this on to make it so prey will be knocked out/die while being drained, or you will feed yourself to the prey's selected stomach if you're feeding them. Can be toggled at any time."
|
||||
@@ -618,110 +607,132 @@
|
||||
C.drain_finalized = !C.drain_finalized
|
||||
to_chat(C, "<span class='notice'>You will [C.drain_finalized?"now":"not"] finalize draining/feeding.</span>")
|
||||
|
||||
/mob/living/carbon/human/proc/shred_limb() //If you're looking at this, nothing but pain and suffering lies below.
|
||||
|
||||
//Test to see if we can shred a mob. Some child override needs to pass us a target. We'll return it if you can.
|
||||
/mob/living/var/vore_shred_time = 45 SECONDS
|
||||
/mob/living/proc/can_shred(var/mob/living/carbon/human/target)
|
||||
//Needs to have organs to be able to shred them.
|
||||
if(!istype(target))
|
||||
to_chat(src,"<span class='warning'>You can't shred that type of creature.</span>")
|
||||
return FALSE
|
||||
//Needs to be capable (replace with incapacitated call?)
|
||||
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
|
||||
to_chat(src,"<span class='warning'>You cannot do that in your current state!</span>")
|
||||
return FALSE
|
||||
//Needs to be adjacent, at the very least.
|
||||
if(!Adjacent(target))
|
||||
to_chat(src,"<span class='warning'>You must be next to your target.</span>")
|
||||
return FALSE
|
||||
//Cooldown on abilities
|
||||
if(last_special > world.time)
|
||||
to_chat(src,"<span class='warning'>You can't perform an ability again so soon!</span>")
|
||||
return FALSE
|
||||
|
||||
return target
|
||||
|
||||
//Human test for shreddability, returns the mob if they can be shredded.
|
||||
/mob/living/carbon/human/vore_shred_time = 10 SECONDS
|
||||
/mob/living/carbon/human/can_shred()
|
||||
//Humans need a grab
|
||||
var/obj/item/weapon/grab/G = get_active_hand()
|
||||
if(!istype(G))
|
||||
to_chat(src,"<span class='warning'>You have to have a very strong grip on someone first!</span>")
|
||||
return FALSE
|
||||
if(G.state != GRAB_NECK)
|
||||
to_chat(src,"<span class='warning'>You must have a tighter grip to severely damage this creature!</span>")
|
||||
return FALSE
|
||||
|
||||
return ..(G.affecting)
|
||||
|
||||
//PAIs don't need a grab or anything
|
||||
/mob/living/silicon/pai/can_shred(var/mob/living/carbon/human/target)
|
||||
if(!target)
|
||||
var/list/choices = list()
|
||||
for(var/mob/living/carbon/human/M in oviewers(1))
|
||||
choices += M
|
||||
|
||||
if(!choices.len)
|
||||
to_chat(src,"<span class='warning'>There's nobody nearby to use this on.</span>")
|
||||
|
||||
target = input(src,"Who do you wish to target?","Damage/Remove Prey's Organ") as null|anything in choices
|
||||
if(!istype(target))
|
||||
return FALSE
|
||||
|
||||
return ..(target)
|
||||
|
||||
/mob/living/proc/shred_limb()
|
||||
set name = "Damage/Remove Prey's Organ"
|
||||
set desc = "Severely damages prey's organ. If the limb is already severely damaged, it will be torn off."
|
||||
set category = "Abilities"
|
||||
if(!ishuman(src))
|
||||
return //If you're not a human you don't have permission to do this.
|
||||
|
||||
if(last_special > world.time)
|
||||
//can_shred() will return a mob we can shred, if we can shred any.
|
||||
var/mob/living/carbon/human/T = can_shred()
|
||||
if(!istype(T))
|
||||
return //Silent, because can_shred does messages.
|
||||
|
||||
//Let them pick any of the target's external organs
|
||||
var/obj/item/organ/external/T_ext = input(src,"What do you wish to severely damage?") as null|anything in T.organs //D for destroy.
|
||||
if(!T_ext) //Picking something here is critical.
|
||||
return
|
||||
|
||||
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
|
||||
to_chat(src, "You cannot severely damage anything in your current state!")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/C = src
|
||||
var/obj/item/weapon/grab/G = src.get_active_hand()
|
||||
if(!istype(G))
|
||||
to_chat(C, "<span class='warning'>We must be grabbing a creature in our active hand to severely damage them.</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/T = G.affecting
|
||||
if(!istype(T)) //Are they a mob?
|
||||
to_chat(C, "<span class='warning'>\The [T] is not able to be severely damaged!</span>")
|
||||
return
|
||||
|
||||
if(G.state != GRAB_NECK)
|
||||
to_chat(C, "<span class='warning'>You must have a tighter grip to severely damage this creature.</span>")
|
||||
return
|
||||
|
||||
if(!T || !C || C.stat)
|
||||
return
|
||||
|
||||
if(!Adjacent(T))
|
||||
return
|
||||
|
||||
var/list/choices2 = list()
|
||||
for(var/obj/item/organ/O in T.organs) //External organs
|
||||
choices2 += O
|
||||
|
||||
var/obj/item/organ/external/D = input(C,"What do you wish to severely damage?") as null|anything in choices2 //D for destroy.
|
||||
if(D.vital)
|
||||
if(alert("Are you sure you wish to severely damage their [D]? It most likely will kill the prey...",,"Yes", "No") != "Yes")
|
||||
if(T_ext.vital)
|
||||
if(alert("Are you sure you wish to severely damage their [T_ext]? It will likely kill [T]...",,"Yes", "No") != "Yes")
|
||||
return //If they reconsider, don't continue.
|
||||
|
||||
var/list/choices3 = list()
|
||||
for(var/obj/item/organ/internal/I in D.internal_organs) //Look for the internal organ in the organ being shreded.
|
||||
choices3 += I
|
||||
//Any internal organ, if there are any
|
||||
var/obj/item/organ/internal/T_int = input(src,"Do you wish to severely damage an internal organ, as well? If not, click 'cancel'") as null|anything in T_ext.internal_organs
|
||||
if(T_int && T_int.vital)
|
||||
if(alert("Are you sure you wish to severely damage their [T_int]? It will likely kill [T]...",,"Yes", "No") != "Yes")
|
||||
return //If they reconsider, don't continue.
|
||||
|
||||
var/obj/item/organ/internal/P = input(C,"Do you wish to severely damage an internal organ, as well? If not, click 'cancel'") as null|anything in choices3
|
||||
//And a belly, if they want
|
||||
var/obj/belly/B = input(src,"Do you wish to swallow the organ if you tear if out? If not, click 'cancel'") as null|anything in vore_organs
|
||||
|
||||
var/eat_limb = input(C,"Do you wish to swallow the organ if you tear if out? If so, select which stomach.") as null|anything in C.vore_organs //EXTREMELY EFFICIENT
|
||||
|
||||
if(last_special > world.time)
|
||||
if(can_shred(T) != T)
|
||||
to_chat(src,"<span class='warning'>Looks like you lost your chance...</span>")
|
||||
return
|
||||
|
||||
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
|
||||
to_chat(C, "You cannot shred in your current state.")
|
||||
return
|
||||
last_special = world.time + vore_shred_time
|
||||
visible_message("<span class='danger'>[src] appears to be preparing to do something to [T]!</span>") //Let everyone know that bad times are ahead
|
||||
|
||||
last_special = world.time + 100 //10 seconds.
|
||||
C.visible_message("<font color='red'><b>[C] appears to be preparing to do something to [T]!</b></font>") //Let everyone know that bad times are head
|
||||
if(do_after(src, vore_shred_time, T)) //Ten seconds. You have to be in a neckgrab for this, so you're already in a bad position.
|
||||
if(can_shred(T) != T)
|
||||
to_chat(src,"<span class='warning'>Looks like you lost your chance...</span>")
|
||||
return
|
||||
|
||||
//Removing an internal organ
|
||||
if(T_int && T_int.damage >= 25) //Internal organ and it's been severely damaged
|
||||
T.apply_damage(15, BRUTE, T_ext) //Damage the external organ they're going through.
|
||||
T_int.removed()
|
||||
if(B)
|
||||
T_int.forceMove(B) //Move to pred's gut
|
||||
visible_message("<span class='danger'>[src] severely damages [T_int.name] of [T]!</span>")
|
||||
else
|
||||
T_int.forceMove(T.loc)
|
||||
visible_message("<span class='danger'>[src] severely damages [T_ext.name] of [T], resulting in their [T_int.name] coming out!</span>","<span class='warning'>You tear out [T]'s [T_int.name]!</span>")
|
||||
|
||||
if(do_after(C, 100, T)) //Ten seconds. You have to be in a neckgrab for this, so you're already in a bad position.
|
||||
if(!Adjacent(T)) return
|
||||
if(P && P.damage >= 25) //Internal organ and it's been severely damage
|
||||
T.apply_damage(15, BRUTE, D) //Damage the external organ they're going through.
|
||||
P.removed()
|
||||
P.forceMove(T.loc) //Move to where prey is.
|
||||
log_and_message_admins("tore out [P] of [T].", C)
|
||||
if(eat_limb)
|
||||
var/datum/belly/S = C.vore_organs[eat_limb]
|
||||
P.forceMove(C) //Move to pred's gut
|
||||
S.internal_contents |= P //Add to pred's gut.
|
||||
C.visible_message("<font color='red'><b>[C] severely damages [D] of [T]!</b></font>") // Same as below, but (pred) damages the (right hand) of (person)
|
||||
to_chat(C, "[P] of [T] moves into your [S]!") //Quietly eat their internal organ! Comes out "The (right hand) of (person) moves into your (stomach)
|
||||
playsound(C, S.vore_sound, 70, 1)
|
||||
log_and_message_admins("tore out and ate [P] of [T].", C)
|
||||
//Removing an external organ
|
||||
else if(!T_int && (T_ext.damage >= 25 || T_ext.brute_dam >= 25))
|
||||
T_ext.droplimb(1,DROPLIMB_EDGE) //Clean cut so it doesn't kill the prey completely.
|
||||
|
||||
//Is it groin/chest? You can't remove those.
|
||||
if(T_ext.cannot_amputate)
|
||||
T.apply_damage(25, BRUTE, T_ext)
|
||||
visible_message("<span class='danger'>[src] severely damages [T]'s [T_ext.name]!</span>")
|
||||
else if(B)
|
||||
T_ext.forceMove(B)
|
||||
visible_message("<span class='warning'>[src] swallows [T]'s [T_ext.name] into their [lowertext(B.name)]!</span>")
|
||||
else
|
||||
log_and_message_admins("tore out [P] of [T].", C)
|
||||
C.visible_message("<font color='red'><b>[C] severely damages [D] of [T], resulting in their [P] coming out!</b></font>")
|
||||
else if(!P && (D.damage >= 25 || D.brute_dam >= 25)) //Not targeting an internal organ & external organ has been severely damaged already.
|
||||
D.droplimb(1,DROPLIMB_EDGE) //Clean cut so it doesn't kill the prey completely.
|
||||
if(D.cannot_amputate) //Is it groin/chest? You can't remove those.
|
||||
T.apply_damage(25, BRUTE, D)
|
||||
C.visible_message("<font color='red'><b>[C] severely damage [T]'s [D]!</b></font>") //Keep it vague. Let the /me's do the talking.
|
||||
log_and_message_admins("shreded [T]'s [D].", C)
|
||||
return
|
||||
if(eat_limb)
|
||||
var/datum/belly/S = C.vore_organs[eat_limb]
|
||||
D.forceMove(C) //Move to pred's gut
|
||||
S.internal_contents |= D //Add to pred's gut.
|
||||
C.visible_message("<span class='warning'>[C] swallows [D] of [T] into their [S]!</span>","You swallow [D] of [T]!")
|
||||
playsound(C, S.vore_sound, 70, 1)
|
||||
to_chat(C, "Their [D] moves into your [S]!")
|
||||
log_and_message_admins("tore off and ate [D] of [T].", C)
|
||||
else
|
||||
C.visible_message("<span class='warning'>[C] tears off [D] of [T]!</span>","You tear out [D] of [T]!") //Will come out "You tear out (the right foot) of (person)
|
||||
log_and_message_admins("tore off [T]'s [D].", C)
|
||||
else //Not targeting an internal organ w/ > 25 damage , and the limb doesn't have < 25 damage.
|
||||
if(P)
|
||||
P.damage = 25 //Internal organs can only take damage, not brute damage.
|
||||
T.apply_damage(25, BRUTE, D)
|
||||
C.visible_message("<font color='red'><b>[C] severely damages [D] of [T]!</b></font>") //Keep it vague. Let the /me's do the talking.
|
||||
log_and_message_admins("shreded [D] of [T].", C)
|
||||
T_ext.forceMove(T.loc)
|
||||
visible_message("<span class='warning'>[src] tears off [T]'s [T_ext.name]!</span>","<span class='warning'>You tear off [T]'s [T_ext.name]!</span>")
|
||||
|
||||
//Not targeting an internal organ w/ > 25 damage , and the limb doesn't have < 25 damage.
|
||||
else
|
||||
if(T_int)
|
||||
T_int.damage = 25 //Internal organs can only take damage, not brute damage.
|
||||
T.apply_damage(25, BRUTE, T_ext)
|
||||
visible_message("<span class='danger'>[src] severely damages [T]'s [T_ext.name]!</span>")
|
||||
|
||||
add_attack_logs(src,T,"Shredded (hardvore)")
|
||||
|
||||
/mob/living/proc/flying_toggle()
|
||||
set name = "Toggle Flight"
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
/mob/living/carbon/human/proc/succubus_drain_finalize,
|
||||
/mob/living/carbon/human/proc/succubus_drain_lethal,
|
||||
/mob/living/carbon/human/proc/bloodsuck,
|
||||
/mob/living/carbon/human/proc/shred_limb,
|
||||
/mob/living/proc/shred_limb,
|
||||
/mob/living/proc/flying_toggle,
|
||||
/mob/living/proc/start_wings_hovering) //Xenochimera get all the special verbs since they can't select traits.
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
||||
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#777777"
|
||||
@@ -76,7 +76,7 @@
|
||||
secondary_langs = list(LANGUAGE_SKRELLIAN)
|
||||
name_language = LANGUAGE_SKRELLIAN
|
||||
color_mult = 1
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
||||
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
@@ -120,7 +120,7 @@
|
||||
secondary_langs = list(LANGUAGE_BIRDSONG)
|
||||
name_language = LANGUAGE_BIRDSONG
|
||||
color_mult = 1
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb,/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering)
|
||||
inherent_verbs = list(/mob/living/proc/shred_limb,/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering)
|
||||
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
@@ -183,7 +183,7 @@
|
||||
"You feel uncomfortably warm.",
|
||||
"Your overheated skin itches."
|
||||
)
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
||||
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||
|
||||
/datum/species/fl_zorren
|
||||
name = "Flatland Zorren"
|
||||
@@ -215,7 +215,7 @@
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#333333"
|
||||
color_mult = 1
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
||||
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||
|
||||
heat_discomfort_strings = list(
|
||||
"Your fur prickles in the heat.",
|
||||
@@ -241,7 +241,7 @@
|
||||
// gluttonous = 1
|
||||
num_alternate_languages = 3
|
||||
color_mult = 1
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
||||
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||
|
||||
blurb = "Vulpkanin are a species of sharp-witted canine-pideds residing on the planet Altam just barely within the \
|
||||
dual-star Vazzend system. Their politically de-centralized society and independent natures have led them to become a species and \
|
||||
@@ -295,7 +295,7 @@
|
||||
"You feel uncomfortably warm.",
|
||||
"Your chitin feels hot."
|
||||
)
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
||||
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||
|
||||
/datum/species/unathi
|
||||
spawn_flags = SPECIES_CAN_JOIN //Species_can_join is the only spawn flag all the races get, so that none of them will be whitelist only if whitelist is enabled.
|
||||
@@ -304,7 +304,7 @@
|
||||
tail_animation = 'icons/mob/species/unathi/tail_vr.dmi'
|
||||
color_mult = 1
|
||||
min_age = 18
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
||||
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||
|
||||
/datum/species/tajaran
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
@@ -314,7 +314,7 @@
|
||||
color_mult = 1
|
||||
min_age = 18
|
||||
gluttonous = 0 //Moving this here so I don't have to fix this conflict every time polaris glances at station.dm
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
||||
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||
|
||||
/datum/species/skrell
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
@@ -340,7 +340,7 @@
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/sonar_ping,
|
||||
/mob/living/proc/hide,
|
||||
/mob/living/carbon/human/proc/shred_limb,
|
||||
/mob/living/proc/shred_limb,
|
||||
/mob/living/proc/toggle_pass_table
|
||||
)
|
||||
|
||||
@@ -361,7 +361,7 @@
|
||||
min_age = 18
|
||||
icobase = 'icons/mob/human_races/r_vox_old.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_vox_old.dmi'
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
||||
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||
|
||||
datum/species/harpy
|
||||
name = "Rapala"
|
||||
|
||||
@@ -96,10 +96,21 @@
|
||||
cost = -1
|
||||
var_changes = list("flash_mod" = 2.0)
|
||||
|
||||
/datum/trait/hollow
|
||||
name = "Hollow Bones/Aluminum Alloy"
|
||||
desc = "Your bones and robot limbs are much easier to break."
|
||||
cost = -2 //I feel like this should be higher, but let's see where it goes
|
||||
|
||||
/datum/trait/hollow/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
for(var/obj/item/organ/external/O in H.organs)
|
||||
O.min_broken_damage *= 0.5
|
||||
O.min_bruised_damage *= 0.5
|
||||
|
||||
/datum/trait/lightweight
|
||||
name = "Lightweight"
|
||||
desc = "Your light weight and poor balance make you very susceptible to unhelpful bumping. Think of it like a bowling ball versus a pin."
|
||||
cost = -4
|
||||
cost = -2
|
||||
var_changes = list("lightweight" = 1)
|
||||
|
||||
/datum/trait/colorblind
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
|
||||
/datum/trait/hard_vore/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.verbs |= /mob/living/carbon/human/proc/shred_limb
|
||||
H.verbs |= /mob/living/proc/shred_limb
|
||||
|
||||
/datum/trait/trashcan
|
||||
name = "Trash Can"
|
||||
|
||||
@@ -48,8 +48,7 @@
|
||||
|
||||
if(istype(A, /obj/item/clothing/accessory/badge) || istype(A, /obj/item/clothing/accessory/medal))
|
||||
user.visible_message("<span class='danger'>\The [user] tears off \the [A] from [src]'s [suit.name]!</span>")
|
||||
attack_log += "\[[time_stamp()]\] <font color='orange'>Has had \the [A] removed by [user.name] ([user.ckey])</font>"
|
||||
user.attack_log += "\[[time_stamp()]\] <font color='red'>Attempted to remove [name]'s ([ckey]) [A.name]</font>"
|
||||
add_attack_logs(user,src,"Stripped [A.name] off [suit.name]")
|
||||
A.on_removed(user)
|
||||
suit.accessories -= A
|
||||
update_inv_w_uniform()
|
||||
@@ -81,7 +80,7 @@
|
||||
return
|
||||
|
||||
if(stripping)
|
||||
admin_attack_log(user, src, "Attempted to remove \a [target_slot]", "Target of an attempt to remove \a [target_slot].", "attempted to remove \a [target_slot] from")
|
||||
add_attack_logs(user,src,"Removed equipment from slot [target_slot]")
|
||||
unEquip(target_slot)
|
||||
else if(user.unEquip(held))
|
||||
equip_to_slot_if_possible(held, text2num(slot_to_strip), 0, 1, 1)
|
||||
@@ -108,8 +107,7 @@
|
||||
if (suit.has_sensor >= 2)
|
||||
user << "<span class='warning'>\The [src]'s suit sensor controls are locked.</span>"
|
||||
return
|
||||
attack_log += text("\[[time_stamp()]\] <font color='orange'>Has had their sensors toggled by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Attempted to toggle [name]'s ([ckey]) sensors</font>")
|
||||
add_attack_logs(user,src,"Adjusted suit sensor level")
|
||||
suit.set_sensors(user)
|
||||
|
||||
// Remove all splints.
|
||||
|
||||
@@ -17,31 +17,23 @@ core parts. The key difference is that when we generate overlays we do not gener
|
||||
versions. Instead, we generate both and store them in two fixed-length lists, both using the same list-index
|
||||
(The indexes are in update_icons.dm): Each list for humans is (at the time of writing) of length 19.
|
||||
This will hopefully be reduced as the system is refined.
|
||||
|
||||
var/overlays_lying[19] //For the lying down stance
|
||||
var/overlays_standing[19] //For the standing stance
|
||||
|
||||
When we call update_icons, the 'lying' variable is checked and then the appropriate list is assigned to our overlays!
|
||||
That in itself uses a tiny bit more memory (no more than all the ridiculous lists the game has already mind you).
|
||||
|
||||
On the other-hand, it should be very CPU cheap in comparison to the old system.
|
||||
In the old system, we updated all our overlays every life() call, even if we were standing still inside a crate!
|
||||
or dead!. 25ish overlays, all generated from scratch every second for every xeno/human/monkey and then applied.
|
||||
More often than not update_clothing was being called a few times in addition to that! CPU was not the only issue,
|
||||
all those icons had to be sent to every client. So really the cost was extremely cumulative. To the point where
|
||||
update_clothing would frequently appear in the top 10 most CPU intensive procs during profiling.
|
||||
|
||||
Another feature of this new system is that our lists are indexed. This means we can update specific overlays!
|
||||
So we only regenerate icons when we need them to be updated! This is the main saving for this system.
|
||||
|
||||
In practice this means that:
|
||||
everytime you fall over, we just switch between precompiled lists. Which is fast and cheap.
|
||||
Everytime you do something minor like take a pen out of your pocket, we only update the in-hand overlay
|
||||
etc...
|
||||
|
||||
|
||||
There are several things that need to be remembered:
|
||||
|
||||
> Whenever we do something that should cause an overlay to update (which doesn't use standard procs
|
||||
( i.e. you do something like l_hand = /obj/item/something new(src) )
|
||||
You will need to call the relevant update_inv_* proc:
|
||||
@@ -61,12 +53,9 @@ There are several things that need to be remembered:
|
||||
update_inv_back()
|
||||
update_inv_handcuffed()
|
||||
update_inv_wear_mask()
|
||||
|
||||
All of these are named after the variable they update from. They are defined at the mob/ level like
|
||||
update_clothing was, so you won't cause undefined proc runtimes with usr.update_inv_wear_id() if the usr is a
|
||||
slime etc. Instead, it'll just return without doing any work. So no harm in calling it for slimes and such.
|
||||
|
||||
|
||||
> There are also these special cases:
|
||||
update_mutations() //handles updating your appearance for certain mutations. e.g TK head-glows
|
||||
UpdateDamageIcon() //handles damage overlays for brute/burn damage //(will rename this when I geta round to it)
|
||||
@@ -74,7 +63,6 @@ There are several things that need to be remembered:
|
||||
update_hair() //Handles updating your hair overlay (used to be update_face, but mouth and
|
||||
...eyes were merged into update_body)
|
||||
update_targeted() // Updates the target overlay when someone points a gun at you
|
||||
|
||||
> All of these procs update our overlays_lying and overlays_standing, and then call update_icons() by default.
|
||||
If you wish to update several overlays at once, you can set the argument to 0 to disable the update and call
|
||||
it manually:
|
||||
@@ -82,25 +70,20 @@ There are several things that need to be remembered:
|
||||
update_inv_head(0)
|
||||
update_inv_l_hand(0)
|
||||
update_inv_r_hand() //<---calls update_icons()
|
||||
|
||||
or equivillantly:
|
||||
update_inv_head(0)
|
||||
update_inv_l_hand(0)
|
||||
update_inv_r_hand(0)
|
||||
update_icons()
|
||||
|
||||
> If you need to update all overlays you can use regenerate_icons(). it works exactly like update_clothing used to.
|
||||
|
||||
> I reimplimented an old unused variable which was in the code called (coincidentally) var/update_icon
|
||||
It can be used as another method of triggering regenerate_icons(). It's basically a flag that when set to non-zero
|
||||
will call regenerate_icons() at the next life() call and then reset itself to 0.
|
||||
The idea behind it is icons are regenerated only once, even if multiple events requested it.
|
||||
|
||||
This system is confusing and is still a WIP. It's primary goal is speeding up the controls of the game whilst
|
||||
reducing processing costs. So please bear with me while I iron out the kinks. It will be worth it, I promise.
|
||||
If I can eventually free var/lying stuff from the life() process altogether, stuns/death/status stuff
|
||||
will become less affected by lag-spikes and will be instantaneous! :3
|
||||
|
||||
If you have any questions/constructive-comments/bugs-to-report/or have a massivly devestated butt...
|
||||
Please contact me on #coderbus IRC. ~Carn x
|
||||
*/
|
||||
@@ -423,24 +406,20 @@ var/global/list/damage_icon_parts = list()
|
||||
var/icon/temp = part.get_icon(skeleton)
|
||||
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
|
||||
//And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part)
|
||||
if(part.icon_position == RIGHT)
|
||||
if(part.icon_position & (LEFT | RIGHT))
|
||||
var/icon/temp2 = new('icons/mob/human.dmi',"blank")
|
||||
var/icon/temp3 = new('icons/mob/human.dmi',"blank")
|
||||
temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH)
|
||||
temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH)
|
||||
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
|
||||
if(!(part.icon_position & LEFT))
|
||||
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
|
||||
if(!(part.icon_position & RIGHT))
|
||||
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
|
||||
base_icon.Blend(temp2, ICON_OVERLAY)
|
||||
temp3.Insert(new/icon(temp,dir=WEST),dir=WEST)
|
||||
base_icon.Blend(temp3, ICON_UNDERLAY)
|
||||
else if(part.icon_position == LEFT)
|
||||
var/icon/temp2 = new('icons/mob/human.dmi',"blank")
|
||||
var/icon/temp3 = new('icons/mob/human.dmi',"blank")
|
||||
temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH)
|
||||
temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH)
|
||||
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
|
||||
base_icon.Blend(temp2, ICON_OVERLAY)
|
||||
temp3.Insert(new/icon(temp,dir=EAST),dir=EAST)
|
||||
base_icon.Blend(temp3, ICON_UNDERLAY)
|
||||
if(part.icon_position & LEFT)
|
||||
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
|
||||
if(part.icon_position & RIGHT)
|
||||
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
|
||||
base_icon.Blend(temp2, ICON_UNDERLAY)
|
||||
else if(part.icon_position & UNDER)
|
||||
base_icon.Blend(temp, ICON_UNDERLAY)
|
||||
else
|
||||
@@ -947,7 +926,7 @@ var/global/list/damage_icon_parts = list()
|
||||
else
|
||||
overlays_standing[SHOES_LAYER] = null
|
||||
overlays_standing[SHOES_LAYER_ALT] = null
|
||||
if(update_icons) update_icons()
|
||||
if(update_icons) update_icons_layers()
|
||||
|
||||
/mob/living/carbon/human/update_inv_s_store(var/update_icons=1)
|
||||
if(QDESTROYING(src))
|
||||
@@ -1612,4 +1591,4 @@ var/global/list/damage_icon_parts = list()
|
||||
#undef TARGETED_LAYER
|
||||
#undef FIRE_LAYER
|
||||
#undef WATER_LAYER
|
||||
#undef TOTAL_LAYERS
|
||||
#undef TOTAL_LAYERS
|
||||
@@ -29,8 +29,6 @@
|
||||
//Random events (vomiting etc)
|
||||
handle_random_events()
|
||||
|
||||
attempt_vr(src,"handle_internal_contents",args) //VOREStation Code
|
||||
|
||||
. = 1
|
||||
|
||||
//Chemicals in the body, this is moved over here so that blood can be added after death
|
||||
|
||||
@@ -137,8 +137,6 @@ default behaviour is:
|
||||
return
|
||||
|
||||
// VOREStation Edit - Begin
|
||||
// Handle grabbing, stomping, and such of micros!
|
||||
if(handle_micro_bump_other(tmob)) return
|
||||
// Plow that nerd.
|
||||
if(ishuman(tmob))
|
||||
var/mob/living/carbon/human/H = tmob
|
||||
@@ -147,6 +145,8 @@ default behaviour is:
|
||||
H.Weaken(20)
|
||||
now_pushing = 0
|
||||
return
|
||||
// Handle grabbing, stomping, and such of micros!
|
||||
if(handle_micro_bump_other(tmob)) return
|
||||
// VOREStation Edit - End
|
||||
|
||||
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
|
||||
@@ -1178,15 +1178,9 @@ default behaviour is:
|
||||
//limit throw range by relative mob size
|
||||
throw_range = round(M.throw_range * min(src.mob_size/M.mob_size, 1))
|
||||
|
||||
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
|
||||
var/turf/end_T = get_turf(target)
|
||||
if(start_T && end_T)
|
||||
var/start_T_descriptor = "<font color='#6b5d00'>tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]</font>"
|
||||
var/end_T_descriptor = "<font color='#6b4400'>tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]</font>"
|
||||
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been thrown by [usr.name] ([usr.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]</font>")
|
||||
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]</font>")
|
||||
msg_admin_attack("[usr.name] ([usr.ckey]) has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>)")
|
||||
if(end_T)
|
||||
add_attack_logs(src,M,"Thrown via grab to [end_T.x],[end_T.y],[end_T.z]")
|
||||
|
||||
src.drop_from_inventory(item)
|
||||
if(!item || !isturf(item.loc))
|
||||
@@ -1210,3 +1204,18 @@ default behaviour is:
|
||||
|
||||
|
||||
item.throw_at(target, throw_range, item.throw_speed, src)
|
||||
|
||||
/mob/living/get_sound_env(var/pressure_factor)
|
||||
if (hallucination)
|
||||
return PSYCHOTIC
|
||||
else if (druggy)
|
||||
return DRUGGED
|
||||
else if (drowsyness)
|
||||
return DIZZY
|
||||
else if (confused)
|
||||
return DIZZY
|
||||
else if (sleeping)
|
||||
return UNDERWATER
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -271,10 +271,7 @@
|
||||
var/mob/M = O.thrower
|
||||
var/client/assailant = M.client
|
||||
if(assailant)
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a [O], thrown by [M.name] ([assailant.ckey])</font>")
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with a thrown [O]</font>")
|
||||
if(!istype(src,/mob/living/simple_animal/mouse))
|
||||
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
|
||||
add_attack_logs(M,src,"Hit by thrown [O.name]")
|
||||
|
||||
// Begin BS12 momentum-transfer code.
|
||||
var/mass = 1.5
|
||||
@@ -337,8 +334,7 @@
|
||||
return
|
||||
|
||||
adjustBruteLoss(damage)
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name] ([src.ckey])</font>")
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>was attacked by [user.name] ([user.ckey])</font>")
|
||||
add_attack_logs(user,src,"Generic attack (probably animal)", admin_notify = FALSE) //Usually due to simple_animal attacks
|
||||
src.visible_message("<span class='danger'>[user] has [attack_message] [src]!</span>")
|
||||
user.do_attack_animation(src)
|
||||
spawn(1) updatehealth()
|
||||
|
||||
@@ -270,7 +270,7 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
src.custom_emote(1, "[pick(speaking.signlang_verb)].")
|
||||
|
||||
if (speaking.flags & SIGNLANG)
|
||||
log_say("[name]/[key] : SIGN: [message]")
|
||||
log_say("(SIGN) [message]", src)
|
||||
return say_signlang(message, pick(speaking.signlang_verb), speaking)
|
||||
|
||||
//These will contain the main receivers of the message
|
||||
@@ -366,7 +366,10 @@ proc/get_radio_key_from_channel(var/channel)
|
||||
qdel(I)
|
||||
|
||||
//Log the message to file
|
||||
log_say("[name]/[key][whispering ? " (W)" : ""]: [message]")
|
||||
if(whispering)
|
||||
log_whisper(message,src)
|
||||
else
|
||||
log_say(message, src)
|
||||
return 1
|
||||
|
||||
/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language)
|
||||
|
||||
@@ -151,12 +151,14 @@ var/list/ai_verbs_default = list(
|
||||
add_language(LANGUAGE_UNATHI, 1)
|
||||
add_language(LANGUAGE_SIIK, 1)
|
||||
add_language(LANGUAGE_SKRELLIAN, 1)
|
||||
add_language(LANGUAGE_SKRELLIANFAR, 0)
|
||||
add_language(LANGUAGE_TRADEBAND, 1)
|
||||
add_language(LANGUAGE_GUTTER, 1)
|
||||
add_language(LANGUAGE_EAL, 1)
|
||||
add_language(LANGUAGE_SCHECHI, 1)
|
||||
add_language(LANGUAGE_SIGN, 1)
|
||||
add_language(LANGUAGE_ROOTLOCAL, 1)
|
||||
add_language(LANGUAGE_TERMINUS, 1)
|
||||
|
||||
if(!safety)//Only used by AIize() to successfully spawn an AI.
|
||||
if (!B)//If there is no player/brain inside.
|
||||
@@ -393,7 +395,7 @@ var/list/ai_verbs_default = list(
|
||||
return
|
||||
CentCom_announce(input, usr)
|
||||
usr << "<span class='notice'>Message transmitted.</span>"
|
||||
log_say("[key_name(usr)] has made an IA [using_map.boss_short] announcement: [input]")
|
||||
log_game("[key_name(usr)] has made an IA [using_map.boss_short] announcement: [input]")
|
||||
emergency_message_cooldown = 1
|
||||
spawn(300)
|
||||
emergency_message_cooldown = 0
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
if(!src.client) msg += "\nIt appears to be in stand-by mode.\n" //afk
|
||||
if(UNCONSCIOUS) msg += "\n<span class='warning'>It doesn't seem to be responding.</span>\n"
|
||||
if(DEAD) msg += "\n<span class='deadsay'>It looks completely unsalvageable.</span>\n"
|
||||
msg += attempt_vr(src,"examine_bellies_pai",args) //VOREStation Edit
|
||||
msg += attempt_vr(src,"examine_bellies",args) //VOREStation Edit
|
||||
|
||||
// VOREStation Edit: Start
|
||||
if(ooc_notes)
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
src << "<font color=green>Communication circuit reinitialized. Speech and messaging functionality restored.</font>"
|
||||
|
||||
handle_statuses()
|
||||
handle_internal_contents() //VOREStation edit
|
||||
|
||||
if(health <= 0)
|
||||
death(null,"gives one shrill beep before falling lifeless.")
|
||||
|
||||
@@ -99,6 +99,7 @@
|
||||
add_language(LANGUAGE_TRADEBAND, 1)
|
||||
add_language(LANGUAGE_GUTTER, 1)
|
||||
add_language(LANGUAGE_EAL, 1)
|
||||
add_language(LANGUAGE_TERMINUS, 1)
|
||||
add_language(LANGUAGE_SIGN, 0)
|
||||
|
||||
verbs += /mob/living/silicon/pai/proc/choose_chassis
|
||||
@@ -298,7 +299,7 @@
|
||||
if(istype(T)) T.visible_message("<b>[src]</b> folds outwards, expanding into a mobile form.")
|
||||
verbs += /mob/living/silicon/pai/proc/pai_nom //VOREStation edit
|
||||
verbs += /mob/living/proc/set_size //VOREStation edit
|
||||
verbs += /mob/living/silicon/pai/proc/shred_limb //VORREStation edit
|
||||
verbs += /mob/living/proc/shred_limb //VORREStation edit
|
||||
|
||||
/mob/living/silicon/pai/verb/fold_up()
|
||||
set category = "pAI Commands"
|
||||
@@ -389,9 +390,7 @@
|
||||
if(src.loc == card)
|
||||
return
|
||||
|
||||
for(var/I in vore_organs) //VOREStation edit. Release all their stomach contents. Don't want them to be in the PAI when they fold or weird things might happen.
|
||||
var/datum/belly/B = vore_organs[I] //VOREStation edit
|
||||
B.release_all_contents() //VOREStation edit
|
||||
release_vore_contents() //VOREStation Add
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(istype(T)) T.visible_message("<b>[src]</b> neatly folds inwards, compacting down to a rectangular card.")
|
||||
|
||||
@@ -13,13 +13,12 @@
|
||||
|
||||
/mob/living/silicon/pai/proc/update_fullness_pai() //Determines if they have something in their stomach. Copied and slightly modified.
|
||||
var/new_people_eaten = 0
|
||||
for(var/I in vore_organs)
|
||||
var/datum/belly/B = vore_organs[I]
|
||||
for(var/mob/living/M in B.internal_contents)
|
||||
for(var/belly in vore_organs)
|
||||
var/obj/belly/B = belly
|
||||
for(var/mob/living/M in B)
|
||||
new_people_eaten += M.size_multiplier
|
||||
people_eaten = min(1, new_people_eaten)
|
||||
|
||||
|
||||
/mob/living/silicon/pai/update_icon() //Some functions cause this to occur, such as resting
|
||||
..()
|
||||
update_fullness_pai()
|
||||
@@ -43,114 +42,3 @@
|
||||
icon_state = "[chassis]_full"
|
||||
else if(people_eaten && resting)
|
||||
icon_state = "[chassis]_rest_full"
|
||||
|
||||
/mob/living/silicon/pai/proc/examine_bellies_pai()
|
||||
|
||||
var/message = ""
|
||||
for (var/I in src.vore_organs)
|
||||
var/datum/belly/B = vore_organs[I]
|
||||
message += B.get_examine_msg()
|
||||
|
||||
return message
|
||||
|
||||
|
||||
|
||||
//PAI Remove Limb code
|
||||
/mob/living/silicon/pai/proc/shred_limb()
|
||||
set name = "Damage/Remove Prey's Organ"
|
||||
set desc = "Severely damages prey's organ. If the limb is already severely damaged, it will be torn off."
|
||||
set category = "Abilities"
|
||||
if(!ispAI(src))
|
||||
return //If you're not a pai you don't have permission to do this.
|
||||
var/mob/living/silicon/pai/C = src
|
||||
|
||||
if(last_special > world.time)
|
||||
return
|
||||
|
||||
var/list/choices = list()
|
||||
for(var/mob/living/carbon/human/M in view(1,src))
|
||||
if(!istype(M,/mob/living/silicon) && Adjacent(M))
|
||||
choices += M
|
||||
choices -= src
|
||||
|
||||
var/mob/living/carbon/human/T = input(src,"Who do you wish to target?") as null|anything in choices
|
||||
|
||||
if(!T || !src || src.stat) return
|
||||
|
||||
if(!Adjacent(T)) return
|
||||
|
||||
if(last_special > world.time) return
|
||||
|
||||
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
|
||||
src << "You cannot target in your current state."
|
||||
return
|
||||
|
||||
var/list/choices2 = list()
|
||||
for(var/obj/item/organ/O in T.organs) //External organs
|
||||
choices2 += O
|
||||
|
||||
var/obj/item/organ/external/D = input(C,"What do you wish to severely damage?") as null|anything in choices2 //D for destroy.
|
||||
if(D.vital)
|
||||
if(alert("Are you sure you wish to severely damage their [D]? It most likely will kill the prey...",,"Yes", "No") != "Yes")
|
||||
return //If they reconsider, don't continue.
|
||||
|
||||
var/list/choices3 = list()
|
||||
for(var/obj/item/organ/internal/I in D.internal_organs) //Look for the internal organ in the organ being shreded.
|
||||
choices3 += I
|
||||
|
||||
var/obj/item/organ/internal/P = input(C,"Do you wish to severely damage an internal organ, as well? If not, click 'cancel'") as null|anything in choices3
|
||||
|
||||
var/eat_limb = input(C,"Do you wish to swallow the organ if you tear if out? If so, select which stomach.") as null|anything in C.vore_organs //EXTREMELY EFFICIENT
|
||||
|
||||
if(last_special > world.time)
|
||||
return
|
||||
|
||||
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
|
||||
to_chat(C, "You cannot shred in your current state.")
|
||||
return
|
||||
|
||||
last_special = world.time + 450 //45 seconds.
|
||||
C.visible_message("<font color='red'><b>[C] appears to be preparing to do something to [T]!</b></font>") //Let everyone know that bad times are head
|
||||
|
||||
if(do_after(C, 450, T)) //Fourty-Five seconds. You don't need a neckgrab for this, so it's going to take a long while.
|
||||
if(!Adjacent(T)) return
|
||||
if(P && P.damage >= 25) //Internal organ and it's been severely damage
|
||||
T.apply_damage(15, BRUTE, D) //Damage the external organ they're going through.
|
||||
P.removed()
|
||||
P.forceMove(T.loc) //Move to where prey is.
|
||||
log_and_message_admins("tore out [P] of [T].", C)
|
||||
if(eat_limb)
|
||||
var/datum/belly/S = C.vore_organs[eat_limb]
|
||||
P.forceMove(C) //Move to pred's gut
|
||||
S.internal_contents |= P //Add to pred's gut.
|
||||
C.visible_message("<font color='red'><b>[C] severely damages [D] of [T]!</b></font>") // Same as below, but (pred) damages the (right hand) of (person)
|
||||
to_chat(C, "[P] of [T] moves into your [S]!") //Quietly eat their internal organ! Comes out "The (right hand) of (person) moves into your (stomach)
|
||||
playsound(C, S.vore_sound, 70, 1)
|
||||
log_and_message_admins("tore out and ate [P] of [T].", C)
|
||||
else
|
||||
log_and_message_admins("tore out [P] of [T].", C)
|
||||
C.visible_message("<font color='red'><b>[C] severely damages [D] of [T], resulting in their [P] coming out!</b></font>")
|
||||
else if(!P && (D.damage >= 25 || D.brute_dam >= 25)) //Not targeting an internal organ & external organ has been severely damaged already.
|
||||
D.droplimb(1,DROPLIMB_EDGE) //Clean cut so it doesn't kill the prey completely.
|
||||
if(D.cannot_amputate) //Is it groin/chest? You can't remove those.
|
||||
T.apply_damage(25, BRUTE, D)
|
||||
C.visible_message("<font color='red'><b>[C] severely damage [T]'s [D]!</b></font>") //Keep it vague. Let the /me's do the talking.
|
||||
log_and_message_admins("shreded [T]'s [D].", C)
|
||||
return
|
||||
if(eat_limb)
|
||||
var/datum/belly/S = C.vore_organs[eat_limb]
|
||||
D.forceMove(C) //Move to pred's gut
|
||||
S.internal_contents |= D //Add to pred's gut.
|
||||
C.visible_message("<span class='warning'>[C] swallows [D] of [T] into their [S]!</span>","You swallow [D] of [T]!")
|
||||
playsound(C, S.vore_sound, 70, 1)
|
||||
to_chat(C, "Their [D] moves into your [S]!")
|
||||
log_and_message_admins("tore off and ate [D] of [T].", C)
|
||||
else
|
||||
C.visible_message("<span class='warning'>[C] tears off [D] of [T]!</span>","You tear out [D] of [T]!") //Will come out "You tear out (the right foot) of (person)
|
||||
log_and_message_admins("tore off [T]'s [D].", C)
|
||||
else //Not targeting an internal organ w/ > 25 damage , and the limb doesn't have < 25 damage.
|
||||
if(P)
|
||||
P.damage = 25 //Internal organs can only take damage, not brute damage.
|
||||
T.apply_damage(25, BRUTE, D)
|
||||
C.visible_message("<font color='red'><b>[C] severely damages [D] of [T]!</b></font>") //Keep it vague. Let the /me's do the talking.
|
||||
log_and_message_admins("shreded [D] of [T].", C)
|
||||
|
||||
@@ -527,15 +527,12 @@
|
||||
hearer << deathsound
|
||||
T << deathsound
|
||||
if(is_vore_predator(T))
|
||||
for (var/bellytype in T.vore_organs)
|
||||
var/datum/belly/belly = T.vore_organs[bellytype]
|
||||
for (var/obj/thing in belly.internal_contents)
|
||||
thing.loc = src
|
||||
belly.internal_contents -= thing
|
||||
for (var/mob/subprey in belly.internal_contents)
|
||||
subprey.loc = src
|
||||
belly.internal_contents -= subprey
|
||||
to_chat(subprey, "As [T] melts away around you, you find yourself in [hound]'s [name]")
|
||||
for(var/belly in T.vore_organs)
|
||||
var/obj/belly/B = belly
|
||||
for(var/atom/movable/thing in B)
|
||||
thing.forceMove(src)
|
||||
if(ismob(thing))
|
||||
to_chat(thing, "As [T] melts away around you, you find yourself in [hound]'s [name]")
|
||||
for(var/obj/item/I in T)
|
||||
if(istype(I,/obj/item/organ/internal/mmi_holder/posibrain))
|
||||
var/obj/item/organ/internal/mmi_holder/MMI = I
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/mob/living/silicon/robot/proc/examine_bellies_borg()
|
||||
|
||||
var/message = ""
|
||||
for (var/I in src.vore_organs)
|
||||
var/datum/belly/B = vore_organs[I]
|
||||
for(var/belly in vore_organs)
|
||||
var/obj/belly/B = belly
|
||||
message += B.get_examine_msg()
|
||||
|
||||
return message
|
||||
@@ -256,3 +256,9 @@
|
||||
/mob/living/silicon/robot/put_in_hands(var/obj/item/W) // No hands.
|
||||
W.loc = get_turf(src)
|
||||
return 1
|
||||
|
||||
/mob/living/silicon/robot/is_holding_item_of_type(typepath)
|
||||
for(var/obj/item/I in list(module_state_1, module_state_2, module_state_3))
|
||||
if(istype(I, typepath))
|
||||
return I
|
||||
return FALSE
|
||||
@@ -24,7 +24,6 @@
|
||||
process_killswitch()
|
||||
process_locks()
|
||||
process_queued_alarms()
|
||||
handle_internal_contents() //VOREStation Edit
|
||||
update_canmove()
|
||||
|
||||
/mob/living/silicon/robot/proc/clamp_values()
|
||||
|
||||
@@ -23,7 +23,7 @@ var/global/list/robot_modules = list(
|
||||
var/hide_on_manifest = 0
|
||||
var/channels = list()
|
||||
var/networks = list()
|
||||
var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0, LANGUAGE_SIGN = 0)
|
||||
var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0, LANGUAGE_SIGN = 0, LANGUAGE_TERMINUS = 1)
|
||||
var/sprites = list()
|
||||
var/can_be_pushed = 1
|
||||
var/no_slip = 0
|
||||
@@ -577,11 +577,13 @@ var/global/list/robot_modules = list(
|
||||
LANGUAGE_UNATHI = 1,
|
||||
LANGUAGE_SIIK = 1,
|
||||
LANGUAGE_SKRELLIAN = 1,
|
||||
LANGUAGE_SKRELLIANFAR = 0,
|
||||
LANGUAGE_ROOTLOCAL = 0,
|
||||
LANGUAGE_TRADEBAND = 1,
|
||||
LANGUAGE_GUTTER = 1,
|
||||
LANGUAGE_SCHECHI = 1,
|
||||
LANGUAGE_EAL = 1,
|
||||
LANGUAGE_TERMINUS = 1,
|
||||
LANGUAGE_SIGN = 0
|
||||
)
|
||||
|
||||
|
||||
@@ -120,10 +120,13 @@
|
||||
src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) //Emag. Not a big problem.
|
||||
R.icon = 'icons/mob/widerobot_vr.dmi'
|
||||
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
|
||||
R.ui_style_vr = TRUE
|
||||
//R.icon_state = "k9"
|
||||
R.pixel_x = -16
|
||||
R.old_x = -16
|
||||
R.default_pixel_x = -16
|
||||
R.dogborg = TRUE
|
||||
R.wideborg = TRUE
|
||||
..()
|
||||
|
||||
/obj/item/weapon/robot_module/robot/knine/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
|
||||
@@ -171,10 +174,13 @@
|
||||
src.emag = new /obj/item/weapon/dogborg/pounce(src) //Pounce
|
||||
R.icon = 'icons/mob/widerobot_vr.dmi'
|
||||
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
|
||||
R.ui_style_vr = TRUE
|
||||
//R.icon_state = "medihound"
|
||||
R.pixel_x = -16
|
||||
R.old_x = -16
|
||||
R.default_pixel_x = -16
|
||||
R.dogborg = TRUE
|
||||
R.wideborg = TRUE
|
||||
..()
|
||||
|
||||
/obj/item/weapon/robot_module/robot/ert
|
||||
@@ -198,9 +204,12 @@
|
||||
src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src)
|
||||
R.icon = 'icons/mob/64x64robot_vr.dmi'
|
||||
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
|
||||
R.ui_style_vr = TRUE
|
||||
R.pixel_x = -16
|
||||
R.old_x = -16
|
||||
R.default_pixel_x = -16
|
||||
R.dogborg = TRUE
|
||||
R.wideborg = TRUE
|
||||
..()
|
||||
|
||||
/obj/item/weapon/robot_module/robot/scrubpup
|
||||
@@ -220,10 +229,13 @@
|
||||
src.emag = new /obj/item/weapon/dogborg/pounce(src) //Pounce
|
||||
R.icon = 'icons/mob/widerobot_vr.dmi'
|
||||
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
|
||||
R.ui_style_vr = TRUE
|
||||
//R.icon_state = "scrubpup"
|
||||
R.pixel_x = -16
|
||||
R.old_x = -16
|
||||
R.default_pixel_x = -16
|
||||
R.dogborg = TRUE
|
||||
R.wideborg = TRUE
|
||||
..()
|
||||
|
||||
/obj/item/weapon/robot_module/robot/scrubpup/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
|
||||
@@ -252,9 +264,21 @@
|
||||
src.emag = new /obj/item/weapon/hand_tele(src)
|
||||
R.icon = 'icons/mob/widerobot_vr.dmi'
|
||||
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
|
||||
R.ui_style_vr = TRUE
|
||||
//R.icon_state = "science"
|
||||
R.pixel_x = -16
|
||||
R.old_x = -16
|
||||
R.default_pixel_x = -16
|
||||
R.dogborg = TRUE
|
||||
R.wideborg = TRUE
|
||||
..()
|
||||
|
||||
/obj/item/weapon/robot_module/Reset(var/mob/living/silicon/robot/R)
|
||||
R.pixel_x = initial(pixel_x)
|
||||
R.pixel_y = initial(pixel_y)
|
||||
R.icon = initial(R.icon)
|
||||
R.dogborg = FALSE
|
||||
R.wideborg = FALSE
|
||||
R.ui_style_vr = FALSE
|
||||
R.default_pixel_x = initial(pixel_x)
|
||||
..()
|
||||
@@ -9,11 +9,13 @@
|
||||
LANGUAGE_UNATHI = 0,
|
||||
LANGUAGE_SIIK = 0,
|
||||
LANGUAGE_SKRELLIAN = 0,
|
||||
LANGUAGE_SKRELLIANFAR = 0,
|
||||
LANGUAGE_ROOTLOCAL = 0,
|
||||
LANGUAGE_GUTTER = 1,
|
||||
LANGUAGE_SCHECHI = 0,
|
||||
LANGUAGE_EAL = 1,
|
||||
LANGUAGE_SIGN = 0
|
||||
LANGUAGE_SIGN = 0,
|
||||
LANGUAGE_TERMINUS = 1
|
||||
)
|
||||
sprites = list(
|
||||
"Cerberus" = "syndie_bloodhound",
|
||||
|
||||
@@ -5,8 +5,10 @@
|
||||
var/pounce_cooldown = 0
|
||||
var/pounce_cooldown_time = 40
|
||||
var/leap_at
|
||||
var/dogborg = FALSE
|
||||
var/dogborg = FALSE //Dogborg special features (overlays etc.)
|
||||
var/wideborg = FALSE //When the borg simply doesn't use standard 32p size.
|
||||
var/original_icon = 'icons/mob/robots.dmi'
|
||||
var/ui_style_vr = FALSE //Do we use our hud icons?
|
||||
var/vr_icons = list(
|
||||
"handy-hydro",
|
||||
"handy-service",
|
||||
@@ -84,8 +86,11 @@
|
||||
return
|
||||
|
||||
/mob/living/silicon/robot/proc/vr_sprite_check()
|
||||
if((icon_state in vr_icons) && (icon == 'icons/mob/robots.dmi'))
|
||||
if(wideborg == TRUE)
|
||||
return
|
||||
if((!(original_icon == icon)) && (!(icon == 'icons/mob/robots_vr.dmi')))
|
||||
original_icon = icon
|
||||
if((icon_state in vr_icons) && (icon == 'icons/mob/robots.dmi'))
|
||||
icon = 'icons/mob/robots_vr.dmi'
|
||||
else if(!(icon_state in vr_icons))
|
||||
icon = original_icon
|
||||
icon = original_icon
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
return ..((sanitize ? sanitize(message) : message), whispering = whispering)
|
||||
|
||||
/mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
|
||||
log_say("[key_name(src)] : [message]")
|
||||
log_say(message, src)
|
||||
|
||||
/mob/living/silicon/robot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
|
||||
..()
|
||||
@@ -64,7 +64,7 @@
|
||||
//For holopads only. Usable by AI.
|
||||
/mob/living/silicon/ai/proc/holopad_talk(var/message, verb, datum/language/speaking)
|
||||
|
||||
log_say("[key_name(src)] : [message]")
|
||||
log_say("(HPAD) [message]",src)
|
||||
|
||||
message = trim(message)
|
||||
|
||||
@@ -111,8 +111,6 @@
|
||||
|
||||
/mob/living/silicon/ai/proc/holopad_emote(var/message) //This is called when the AI uses the 'me' verb while using a holopad.
|
||||
|
||||
log_emote("[key_name(src)] : [message]")
|
||||
|
||||
message = trim(message)
|
||||
|
||||
if (!message)
|
||||
@@ -141,6 +139,8 @@
|
||||
if(O)
|
||||
O.see_emote(src, message)
|
||||
|
||||
log_emote("(HPAD) [message]", src)
|
||||
|
||||
else //This shouldn't occur, but better safe then sorry.
|
||||
src << "No holopad connected."
|
||||
return 0
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
// Default hivebot is melee, and a bit more meaty, so it can meatshield for their ranged friends.
|
||||
/mob/living/simple_animal/hostile/hivebot
|
||||
name = "hivebot"
|
||||
desc = "A robot. It appears to be somewhat reslient, but lacking a true weapon."
|
||||
desc = "A robot. It appears to be somewhat resilient, but lacks a true weapon."
|
||||
icon = 'icons/mob/hivebot.dmi'
|
||||
icon_state = "basic"
|
||||
icon_living = "basic"
|
||||
@@ -45,10 +45,10 @@
|
||||
"No threats found.",
|
||||
"Error: No targets found."
|
||||
)
|
||||
emote_hear = list("humms ominously", "whirrs softly", "grinds a gear")
|
||||
emote_hear = list("hums ominously", "whirrs softly", "grinds a gear")
|
||||
emote_see = list("looks around the area", "turns from side to side")
|
||||
say_understood = list("Affirmative.", "Positive")
|
||||
say_cannot = list("Denied.", "Negative")
|
||||
say_understood = list("Affirmative.", "Positive.")
|
||||
say_cannot = list("Denied.", "Negative.")
|
||||
say_maybe_target = list("Possible threat detected. Investigating.", "Motion detected.", "Investigating.")
|
||||
say_got_target = list("Threat detected.", "New task: Remove threat.", "Threat removal engaged.", "Engaging target.")
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
// Melee like the base type, but more fragile.
|
||||
/mob/living/simple_animal/hostile/hivebot/swarm
|
||||
name = "swarm hivebot"
|
||||
desc = "A robot. It looks fragile and weak"
|
||||
desc = "A robot. It looks fragile and weak"
|
||||
maxHealth = 1 LASERS_TO_KILL
|
||||
health = 1 LASERS_TO_KILL
|
||||
melee_damage_lower = 3
|
||||
@@ -86,7 +86,7 @@
|
||||
// Shoots EMPs, to screw over other robots.
|
||||
/mob/living/simple_animal/hostile/hivebot/range/ion
|
||||
name = "engineering hivebot"
|
||||
desc = "A robot. It has a tool which emits focused electromagnetic pulses, which are deadly to other synthetic adverseries."
|
||||
desc = "A robot. It has a tool which emits focused electromagnetic pulses, which are deadly to synthetic adverseries."
|
||||
projectiletype = /obj/item/projectile/ion/small //VOREStation Edit
|
||||
projectilesound = 'sound/weapons/Laser.ogg'
|
||||
icon_living = "engi"
|
||||
@@ -97,7 +97,7 @@
|
||||
// Shoots deadly lasers.
|
||||
/mob/living/simple_animal/hostile/hivebot/range/laser
|
||||
name = "laser hivebot"
|
||||
desc = "A robot. It has an energy weapon."
|
||||
desc = "A robot. It has an energy weapon."
|
||||
projectiletype = /obj/item/projectile/beam/blue
|
||||
projectilesound = 'sound/weapons/Laser.ogg'
|
||||
maxHealth = 2 LASERS_TO_KILL
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/mob/living/simple_animal/cat/fluff/Runtime/init_belly()
|
||||
..()
|
||||
var/datum/belly/B = vore_organs[vore_selected]
|
||||
var/obj/belly/B = vore_selected
|
||||
B.name = "Stomach"
|
||||
B.inside_flavor = "The slimy wet insides of Runtime! Not quite as clean as the cat on the outside."
|
||||
B.desc = "The slimy wet insides of Runtime! Not quite as clean as the cat on the outside."
|
||||
|
||||
B.emote_lists[DM_HOLD] = list(
|
||||
"Runtime's stomach kneads gently on you and you're fairly sure you can hear her start purring.",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//Corgi
|
||||
/mob/living/simple_animal/corgi
|
||||
name = "\improper corgi"
|
||||
name = "corgi"
|
||||
real_name = "corgi"
|
||||
desc = "It's a corgi."
|
||||
intelligence_level = SA_ANIMAL
|
||||
@@ -96,8 +96,8 @@
|
||||
sleep(1)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat/corgi
|
||||
name = "Corgi meat"
|
||||
desc = "Tastes like... well you know..."
|
||||
name = "corgi meat"
|
||||
desc = "Tastes like... well, you know..."
|
||||
|
||||
/mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
|
||||
if(istype(O, /obj/item/weapon/newspaper))
|
||||
@@ -137,7 +137,7 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/corgi/puppy
|
||||
name = "\improper corgi puppy"
|
||||
name = "corgi puppy"
|
||||
real_name = "corgi"
|
||||
desc = "It's a corgi puppy."
|
||||
icon_state = "puppy"
|
||||
@@ -170,7 +170,7 @@
|
||||
//Lisa already has a cute bow!
|
||||
/mob/living/simple_animal/corgi/Lisa/Topic(href, href_list)
|
||||
if(href_list["remove_inv"] || href_list["add_inv"])
|
||||
usr << "<font color='red'>[src] already has a cute bow!</font>"
|
||||
to_chat(usr, "<font color='red'>[src] already has a cute bow!</font>")
|
||||
return
|
||||
..()
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
|
||||
//Technically this should be like, its own file or something or a subset of dog but whatever. Not a coder.
|
||||
/mob/living/simple_animal/corgi/tamaskan
|
||||
name = "\improper tamaskan"
|
||||
name = "tamaskan"
|
||||
real_name = "tamaskan"
|
||||
desc = "It's a tamaskan."
|
||||
icon_state = "tamaskan"
|
||||
|
||||
@@ -11,9 +11,9 @@
|
||||
|
||||
/mob/living/simple_animal/fish/koi/poisonous/Life()
|
||||
..()
|
||||
var/datum/belly/why = check_belly(src)
|
||||
if(why && prob(10))
|
||||
sting(why.owner)
|
||||
if(isbelly(loc) && prob(10))
|
||||
var/obj/belly/B = loc
|
||||
sting(B.owner)
|
||||
|
||||
/mob/living/simple_animal/fish/koi/poisonous/react_to_attack(var/atom/A)
|
||||
if(isliving(A) && Adjacent(A))
|
||||
|
||||
@@ -40,9 +40,9 @@
|
||||
|
||||
/mob/living/simple_animal/fox/init_belly()
|
||||
..()
|
||||
var/datum/belly/B = vore_organs[vore_selected]
|
||||
var/obj/belly/B = vore_selected
|
||||
B.name = "Stomach"
|
||||
B.inside_flavor = "Slick foxguts. Cute on the outside, slimy on the inside!"
|
||||
B.desc = "Slick foxguts. Cute on the outside, slimy on the inside!"
|
||||
|
||||
B.emote_lists[DM_HOLD] = list(
|
||||
"The foxguts knead and churn around you harmlessly.",
|
||||
@@ -187,9 +187,9 @@
|
||||
|
||||
/mob/living/simple_animal/fox/fluff/Renault/init_belly()
|
||||
..()
|
||||
var/datum/belly/B = vore_organs[vore_selected]
|
||||
var/obj/belly/B = vore_selected
|
||||
B.name = "Stomach"
|
||||
B.inside_flavor = "Slick foxguts. They seem somehow more regal than perhaps other foxes!"
|
||||
B.desc = "Slick foxguts. They seem somehow more regal than perhaps other foxes!"
|
||||
|
||||
B.emote_lists[DM_HOLD] = list(
|
||||
"Renault's stomach walls squeeze around you more tightly for a moment, before relaxing, as if testing you a bit.",
|
||||
|
||||
@@ -78,6 +78,7 @@ Nurse Family
|
||||
var/atom/cocoon_target
|
||||
var/egg_inject_chance = 5
|
||||
|
||||
// VOREStation Edit - Keep Nurse Hat Spiders
|
||||
/mob/living/simple_animal/hostile/giant_spider/nurse/medical
|
||||
desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes and a tiny nurse hat."
|
||||
icon_state = "nursemed"
|
||||
@@ -88,7 +89,7 @@ Nurse Family
|
||||
melee_damage_upper = 16
|
||||
poison_type = "tramadol"
|
||||
poison_chance = 15
|
||||
|
||||
// VOREStation Edit End
|
||||
|
||||
/mob/living/simple_animal/hostile/giant_spider/nurse/queen
|
||||
desc = "Absolutely gigantic, this creature is horror itself."
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/simple_animal/slime
|
||||
/mob/living/simple_animal/old_slime
|
||||
name = "pet slime"
|
||||
desc = "A lovable, domesticated slime."
|
||||
icon = 'icons/mob/slimes.dmi'
|
||||
@@ -19,14 +19,14 @@
|
||||
|
||||
var/colour = "grey"
|
||||
|
||||
/mob/living/simple_animal/slime/science
|
||||
/mob/living/simple_animal/old_slime/science
|
||||
name = "Kendrick"
|
||||
colour = "rainbow"
|
||||
icon_state = "rainbow baby slime"
|
||||
icon_living = "rainbow baby slime"
|
||||
icon_dead = "rainbow baby slime dead"
|
||||
|
||||
/mob/living/simple_animal/slime/science/initialize()
|
||||
/mob/living/simple_animal/old_slime/science/initialize()
|
||||
. = ..()
|
||||
overlays.Cut()
|
||||
overlays += "aslime-:33"
|
||||
@@ -56,12 +56,12 @@
|
||||
overlays += "aslime-:33"
|
||||
|
||||
/mob/living/simple_animal/adultslime/death()
|
||||
var/mob/living/simple_animal/slime/S1 = new /mob/living/simple_animal/slime (src.loc)
|
||||
var/mob/living/simple_animal/old_slime/S1 = new /mob/living/simple_animal/old_slime (src.loc)
|
||||
S1.icon_state = "[src.colour] baby slime"
|
||||
S1.icon_living = "[src.colour] baby slime"
|
||||
S1.icon_dead = "[src.colour] baby slime dead"
|
||||
S1.colour = "[src.colour]"
|
||||
var/mob/living/simple_animal/slime/S2 = new /mob/living/simple_animal/slime (src.loc)
|
||||
var/mob/living/simple_animal/old_slime/S2 = new /mob/living/simple_animal/old_slime (src.loc)
|
||||
S2.icon_state = "[src.colour] baby slime"
|
||||
S2.icon_living = "[src.colour] baby slime"
|
||||
S2.icon_dead = "[src.colour] baby slime dead"
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
message = sanitize(message)
|
||||
if (!message)
|
||||
return
|
||||
log_say("[key_name(src)] : [message]")
|
||||
log_say(message,src)
|
||||
if (stat == 2)
|
||||
return say_dead(message)
|
||||
|
||||
|
||||
@@ -27,10 +27,7 @@
|
||||
user << "<span class='warning'>This being is corrupted by an alien intelligence and cannot be soul trapped.</span>"
|
||||
return..()
|
||||
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has had their soul captured with [src.name] by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to capture the soul of [M.name] ([M.ckey])</font>")
|
||||
msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
|
||||
|
||||
add_attack_logs(user,M,"Soulstone'd with [src.name]")
|
||||
transfer_soul("VICTIM", M, user)
|
||||
return
|
||||
|
||||
|
||||
@@ -1269,8 +1269,7 @@
|
||||
var/mob/living/L = target_mob
|
||||
|
||||
if(prob(melee_miss_chance))
|
||||
src.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [L.name] ([L.ckey])</font>")
|
||||
L.attack_log += text("\[[time_stamp()]\] <font color='orange'>was attacked by [src.name] ([src.ckey])</font>")
|
||||
add_attack_logs(src,L,"Animal-attacked (miss)", admin_notify = FALSE)
|
||||
visible_message("<span class='danger'>[src] misses [L]!</span>")
|
||||
do_attack_animation(src)
|
||||
return L
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user