Merge branch 'virgoMaster' into virgoPull

This commit is contained in:
Reddeyfish
2018-03-12 18:41:26 -07:00
445 changed files with 326691 additions and 9521 deletions
+3 -3
View File
@@ -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 .
+87 -8
View File
@@ -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"
+2 -1
View File
@@ -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")
*/
+1
View File
@@ -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,
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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)
+6 -1
View File
@@ -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
+1 -1
View File
@@ -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 ..()
+5
View File
@@ -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!"
+4 -4
View File
@@ -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."
+12
View File
@@ -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
+37 -1
View File
@@ -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."
+1 -1
View File
@@ -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.
+4 -4
View File
@@ -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)
+1 -1
View File
@@ -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"
+7 -17
View File
@@ -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
+2 -2
View File
@@ -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
+9 -9
View File
@@ -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
+1 -1
View File
@@ -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)
+6
View File
@@ -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 -3
View File
@@ -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()
+1
View File
@@ -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"
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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.
+2 -3
View File
@@ -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
+1 -1
View File
@@ -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
+14 -2
View File
@@ -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"
+1 -1
View File
@@ -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))
+16 -1
View File
@@ -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")
+16 -2
View File
@@ -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
@@ -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
-2
View File
@@ -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
+19 -10
View File
@@ -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 ..()
+2 -6
View File
@@ -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()
+5 -2
View File
@@ -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)
+3 -1
View File
@@ -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.")
+3 -4
View File
@@ -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.")
+3 -115
View File
@@ -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
+4 -4
View File
@@ -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