Update from Master
@@ -33,6 +33,19 @@
|
||||
"problemMatcher": [],
|
||||
"label": "tgui: build tgfont",
|
||||
"detail": "node mkdist.cjs && fantasticon --config config.cjs"
|
||||
},
|
||||
{
|
||||
"type": "shell",
|
||||
"command": "tgui/bin/tgui",
|
||||
"windows": {
|
||||
"command": ".\\tgui\\bin\\tgui-prettybuild.bat"
|
||||
},
|
||||
"problemMatcher": [
|
||||
"$tsc",
|
||||
"$eslint-stylish"
|
||||
],
|
||||
"group": "build",
|
||||
"label": "tgui: prettybuild"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,276 @@
|
||||
/obj/item/weapon/melee/shock_maul
|
||||
name = "concussion maul"
|
||||
desc = "A heavy-duty concussion hammer, typically used for mining. An iconic weapon for the many uprisings of Mars. It uses a manually engaged concussive-force amplifier unit in the head to multiply impact force, but its weight and the charge up time makes it difficult to use effectively. Devastating if used correctly, but requires skill."
|
||||
icon_state = "forcemaul"
|
||||
item_state = "forcemaul"
|
||||
slot_flags = SLOT_BACK
|
||||
|
||||
//stopping power/lethality
|
||||
force = 35
|
||||
armor_penetration = 20 //the sheer impact force bypasses quite a bit of armour
|
||||
var/unwielded_force_divisor = 0.25
|
||||
var/wielded = 0
|
||||
var/force_unwielded = 8.75
|
||||
var/wieldsound = null
|
||||
var/unwieldsound = null
|
||||
var/charge_force_mult = 1.75 //damage and AP multiplier on charged hits
|
||||
var/launch_force = 3 //yeet distance
|
||||
var/launch_force_unwielded = 1 //awful w/ one hand, but still gets a little distance
|
||||
var/launch_force_disarm = 1.5 //distance multiplier when swinging in disarm mode, since disarm attacks do half damage
|
||||
var/weaken_force = 2 //stun power
|
||||
var/weaken_force_unwielded = 0 //can't stun at all if used onehanded
|
||||
var/weaken_force_disarm = 1.5 //stun multiplier when in disarm mode
|
||||
|
||||
//mining interacts
|
||||
var/excavation_amount = 200
|
||||
var/destroy_artefacts = TRUE //sorry, breaks stuff
|
||||
|
||||
can_cleave = TRUE //SSSSMITE!
|
||||
attackspeed = 15 //very slow!!
|
||||
sharp = FALSE
|
||||
edge = FALSE
|
||||
throwforce = 25
|
||||
flags = NOCONDUCT
|
||||
w_class = ITEMSIZE_HUGE
|
||||
drop_sound = 'sound/items/drop/metalweapon.ogg'
|
||||
pickup_sound = 'sound/items/pickup/metalweapon.ogg'
|
||||
origin_tech = list(TECH_COMBAT = 5)
|
||||
attack_verb = list("beaten","slammed","smashed","mauled","hammered","bludgeoned")
|
||||
var/lightcolor = "#D3FDFD"
|
||||
var/status = 0 //whether the thing is on or not
|
||||
var/obj/item/weapon/cell/bcell = null
|
||||
var/hitcost = 600 //you get 4 hits out of a standard cell
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/update_held_icon()
|
||||
var/mob/living/M = loc
|
||||
if(istype(M) && M.can_wield_item(src) && is_held_twohanded(M))
|
||||
wielded = 1
|
||||
if(status)
|
||||
force = initial(force)*charge_force_mult
|
||||
armor_penetration *= charge_force_mult
|
||||
else
|
||||
force = initial(force)
|
||||
armor_penetration = initial(armor_penetration)
|
||||
launch_force = initial(launch_force)
|
||||
weaken_force = initial(weaken_force)
|
||||
name = "[initial(name)] (wielded)"
|
||||
update_icon()
|
||||
else
|
||||
wielded = 0
|
||||
if(status)
|
||||
force = force_unwielded*charge_force_mult
|
||||
armor_penetration *= charge_force_mult
|
||||
else
|
||||
force = force_unwielded
|
||||
armor_penetration = initial(armor_penetration)
|
||||
launch_force = launch_force_unwielded
|
||||
weaken_force = weaken_force_unwielded
|
||||
name = "[initial(name)]"
|
||||
update_icon()
|
||||
..()
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/New()
|
||||
..()
|
||||
update_held_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/get_cell()
|
||||
return bcell
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/MouseDrop(obj/over_object as obj)
|
||||
if(!canremove)
|
||||
return
|
||||
|
||||
if (ishuman(usr) || issmall(usr)) //so monkeys can take off their backpacks -- Urist
|
||||
|
||||
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why?
|
||||
return
|
||||
|
||||
if (!( istype(over_object, /obj/screen) ))
|
||||
return ..()
|
||||
|
||||
//makes sure that the thing is equipped, so that we can't drag it into our hand from miles away.
|
||||
//there's got to be a better way of doing this.
|
||||
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
|
||||
return
|
||||
|
||||
if (( usr.restrained() ) || ( usr.stat ))
|
||||
return
|
||||
|
||||
if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src))
|
||||
return
|
||||
|
||||
switch(over_object.name)
|
||||
if("r_hand")
|
||||
usr.u_equip(src)
|
||||
usr.put_in_r_hand(src)
|
||||
if("l_hand")
|
||||
usr.u_equip(src)
|
||||
usr.put_in_l_hand(src)
|
||||
src.add_fingerprint(usr)
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/loaded/New() //this one starts with a cell pre-installed.
|
||||
..()
|
||||
bcell = new/obj/item/weapon/cell/device/weapon(src)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/proc/deductcharge()
|
||||
if(status == 1) //Only deducts charge when it's on
|
||||
if(bcell)
|
||||
if(bcell.checked_use(hitcost))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return null
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/proc/powercheck()
|
||||
if(bcell)
|
||||
if(bcell.charge < hitcost)
|
||||
status = 0
|
||||
update_held_icon()
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/update_icon()
|
||||
if(status)
|
||||
icon_state = "[initial(icon_state)]_active[wielded]"
|
||||
item_state = icon_state
|
||||
else if(!bcell)
|
||||
icon_state = "[initial(icon_state)]_nocell[wielded]"
|
||||
item_state = icon_state
|
||||
else
|
||||
icon_state = "[initial(icon_state)][wielded]"
|
||||
item_state = icon_state
|
||||
|
||||
if(icon_state == "[initial(icon_state)]_active[wielded]")
|
||||
set_light(2, 1, lightcolor)
|
||||
else
|
||||
set_light(0)
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/dropped()
|
||||
..()
|
||||
if(status)
|
||||
status = 0
|
||||
visible_message("<span class='warning'>\The [src]'s grip safety engages!</span>")
|
||||
update_held_icon()
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
if(Adjacent(user))
|
||||
if(bcell)
|
||||
. += "<span class='notice'>The concussion maul is [round(bcell.percent())]% charged.</span>"
|
||||
if(!bcell)
|
||||
. += "<span class='warning'>The concussion maul does not have a power source installed.</span>"
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/attackby(obj/item/weapon/W, mob/user)
|
||||
if(!user.IsAdvancedToolUser())
|
||||
return
|
||||
if(istype(W, /obj/item/weapon/cell))
|
||||
if(istype(W, /obj/item/weapon/cell/device))
|
||||
if(!bcell)
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
bcell = W
|
||||
to_chat(user, "<span class='notice'>You install a cell in \the [src].</span>")
|
||||
update_held_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>\The [src] already has a cell.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>This cell is not fitted for [src].</span>")
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/attack_hand(mob/user as mob)
|
||||
if(user.get_inactive_hand() == src)
|
||||
if(!user.IsAdvancedToolUser())
|
||||
return
|
||||
else if(bcell)
|
||||
bcell.update_icon()
|
||||
user.put_in_hands(bcell)
|
||||
bcell = null
|
||||
to_chat(user, "<span class='notice'>You remove the cell from the [src].</span>")
|
||||
status = 0
|
||||
update_held_icon()
|
||||
return
|
||||
..()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/attack_self(mob/user)
|
||||
if(!user.IsAdvancedToolUser())
|
||||
return
|
||||
if(!status && bcell && bcell.charge >= hitcost)
|
||||
if(do_after(user, 2 SECONDS))
|
||||
status = 1
|
||||
user.visible_message("<span class='warning'>[user] charges \the [src]!</span>","<span class='warning'>You charge \the [src]. <b>It's hammer time!</b></span>")
|
||||
playsound(src, "sparks", 75, 1, -1)
|
||||
update_held_icon()
|
||||
else if(status)
|
||||
status = 0
|
||||
user.visible_message("<span class='notice'>[user] safely disengages \the [src]'s power field.</span>","<span class='notice'>\The [src] is now off.</span>")
|
||||
update_held_icon()
|
||||
playsound(src, "sparks", 75, 1, -1)
|
||||
if(!bcell)
|
||||
to_chat(user, "<span class='warning'>\The [src] does not have a power source!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>\The [src] is out of charge.</span>")
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
..()
|
||||
if(A && wielded && status)
|
||||
deductcharge()
|
||||
status = 0
|
||||
user.visible_message("<span class='warning'>\The [src] discharges with a thunderous, hair-raising crackle!</span>")
|
||||
playsound(src, 'sound/weapons/resonator_blast.ogg', 100, 1, -1)
|
||||
update_held_icon()
|
||||
if(istype(A,/obj/structure/window))
|
||||
var/obj/structure/window/W = A
|
||||
visible_message("<span class='warning'>\The [W] crumples under the force of the impact!</span>")
|
||||
W.shatter()
|
||||
else if(istype(A,/obj/structure/barricade))
|
||||
var/obj/structure/barricade/B = A
|
||||
B.dismantle()
|
||||
else if(istype(A,/obj/structure/grille))
|
||||
qdel(A)
|
||||
powercheck(hitcost)
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
|
||||
. = ..()
|
||||
if(user.a_intent == I_DISARM)
|
||||
launch_force *= launch_force_disarm
|
||||
weaken_force *= weaken_force_disarm
|
||||
|
||||
//yeet 'em away, boys!
|
||||
if(status)
|
||||
var/atom/target_zone = get_edge_target_turf(user,get_dir(user, target))
|
||||
if(!target.anchored) //unless they're secured in place, natch
|
||||
target.throw_at(target_zone, launch_force, 2, user, FALSE)
|
||||
target.Weaken(weaken_force)
|
||||
|
||||
deductcharge()
|
||||
status = 0
|
||||
user.visible_message("<span class='warning'>\The [src] discharges with a thunderous, hair-raising crackle!</span>")
|
||||
playsound(src, 'sound/weapons/resonator_blast.ogg', 100, 1, -1)
|
||||
update_held_icon()
|
||||
powercheck(hitcost)
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/emp_act(severity)
|
||||
if(bcell)
|
||||
bcell.emp_act(severity) //let's not duplicate code everywhere if we don't have to please.
|
||||
if(status)
|
||||
status = 0
|
||||
visible_message("<span class='warning'>\The [src]'s power field hisses and sputters out.</span>")
|
||||
update_held_icon()
|
||||
..()
|
||||
|
||||
/obj/item/weapon/melee/shock_maul/get_description_interaction()
|
||||
var/list/results = list()
|
||||
|
||||
if(bcell)
|
||||
results += "[desc_panel_image("offhand")]to remove the weapon cell."
|
||||
else
|
||||
results += "[desc_panel_image("weapon cell")]to add a new weapon cell."
|
||||
|
||||
results += ..()
|
||||
|
||||
return results
|
||||
@@ -73,6 +73,7 @@
|
||||
prob(2);/obj/item/weapon/twohanded/fireaxe,\
|
||||
prob(2);/obj/item/weapon/gun/projectile/luger/brown,\
|
||||
prob(2);/obj/item/weapon/gun/launcher/crossbow,\
|
||||
prob(2);/obj/item/weapon/melee/shock_maul,\
|
||||
/* prob(1);/obj/item/weapon/gun/projectile/automatic/battlerifle,\ */ // Too OP
|
||||
prob(1);/obj/item/weapon/gun/projectile/deagle/gold,\
|
||||
prob(1);/obj/item/weapon/gun/energy/imperial,\
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/datum/preferences
|
||||
var/extra_languages = 0
|
||||
var/preferred_language = "common" // VOREStation Edit: Allow selecting a preferred language
|
||||
|
||||
/datum/category_item/player_setup_item/general/language
|
||||
name = "Language"
|
||||
@@ -12,6 +13,9 @@
|
||||
if(islist(pref.alternate_languages)) // Because aparently it may not be?
|
||||
testing("LANGSANI: Loaded from [pref.client]'s character [pref.real_name || "-name not yet loaded-"] savefile: [english_list(pref.alternate_languages || list())]")
|
||||
S["language_prefixes"] >> pref.language_prefixes
|
||||
//VORE Edit Begin
|
||||
S["preflang"] >> pref.preferred_language
|
||||
//VORE Edit End
|
||||
S["language_custom_keys"] >> pref.language_custom_keys
|
||||
|
||||
/datum/category_item/player_setup_item/general/language/save_character(var/savefile/S)
|
||||
@@ -21,6 +25,7 @@
|
||||
testing("LANGSANI: Loaded from [pref.client]'s character [pref.real_name || "-name not yet loaded-"] savefile: [english_list(pref.alternate_languages || list())]")
|
||||
S["language_prefixes"] << pref.language_prefixes
|
||||
S["language_custom_keys"] << pref.language_custom_keys
|
||||
S["preflang"] << pref.preferred_language // VOREStation Edit
|
||||
|
||||
/datum/category_item/player_setup_item/general/language/sanitize_character()
|
||||
if(!islist(pref.alternate_languages))
|
||||
@@ -36,6 +41,11 @@
|
||||
testing("LANGSANI: Truncated [pref.client]'s character [pref.real_name || "-name not yet loaded-"] language list because it was too long (len: [pref.alternate_languages.len], allowed: [S.num_alternate_languages])")
|
||||
pref.alternate_languages.len = (S.num_alternate_languages + pref.extra_languages) // Truncate to allowed length
|
||||
|
||||
// VOREStation Edit Start
|
||||
if(!(pref.preferred_language in pref.alternate_languages) || !pref.preferred_language) // Safety handling for if our preferred language is ever somehow removed from the character's list of langauges, or they don't have one set
|
||||
pref.preferred_language = S.language // Reset to default, for safety
|
||||
// VOREStation Edit end
|
||||
|
||||
// Sanitize illegal languages
|
||||
for(var/language in pref.alternate_languages)
|
||||
var/datum/language/L = GLOB.all_languages[language]
|
||||
@@ -80,6 +90,7 @@
|
||||
|
||||
. += "<b>Language Keys</b><br>"
|
||||
. += " [jointext(pref.language_prefixes, " ")] <a href='?src=\ref[src];change_prefix=1'>Change</a> <a href='?src=\ref[src];reset_prefix=1'>Reset</a><br>"
|
||||
. += "<b>Preferred Language</b> <a href='?src=\ref[src];pref_lang=1'>[pref.preferred_language]</a><br>" // VOREStation Add
|
||||
|
||||
/datum/category_item/player_setup_item/general/language/OnTopic(var/href,var/list/href_list, var/mob/user)
|
||||
if(href_list["remove_language"])
|
||||
@@ -167,4 +178,22 @@
|
||||
|
||||
return TOPIC_REFRESH
|
||||
|
||||
// VOREStation Add: Preferred Language
|
||||
else if(href_list["pref_lang"])
|
||||
if(pref.species) // Safety to prevent a null runtime here
|
||||
var/datum/species/S = GLOB.all_species[pref.species]
|
||||
var/list/lang_opts = list(S.language) + pref.alternate_languages + LANGUAGE_GALCOM
|
||||
var/selection = tgui_input_list(user, "Choose your preferred spoken language:", "Preferred Spoken Language", lang_opts, pref.preferred_language)
|
||||
if(!selection) // Set our preferred to default, just in case.
|
||||
tgui_alert_async(user, "Preferred Language not modified.", "Selection Canceled")
|
||||
if(selection)
|
||||
pref.preferred_language = selection
|
||||
if(selection == "common" || selection == S.language)
|
||||
tgui_alert_async(user, "You will now speak your standard default language, [S.language ? S.language : "common"], if you do not specify a language when speaking.", "Preferred Set to Default")
|
||||
else // Did they set anything else?
|
||||
tgui_alert_async(user, "You will now speak [pref.preferred_language] if you do not specify a language when speaking.", "Preferred Language Set")
|
||||
return TOPIC_REFRESH
|
||||
// VOREStation Add End
|
||||
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// Define a place to save appearance in character setup
|
||||
// VOREStation Add Start: Doing this here bc AUTOHISS_FULL is more readable than #
|
||||
#define AUTOHISS_OFF 0
|
||||
#define AUTOHISS_BASIC 1
|
||||
#define AUTOHISS_FULL 2
|
||||
// VOREStation Add End
|
||||
|
||||
/datum/preferences
|
||||
var/vore_egg_type = "Egg" //The egg type they have.
|
||||
var/autohiss = "Full" // VOREStation Add: Whether we have Autohiss on. I'm hijacking the egg panel bc this one has a shitton of unused space.
|
||||
|
||||
// Definition of the stuff for the egg type.
|
||||
/datum/category_item/player_setup_item/vore/egg
|
||||
@@ -9,19 +16,35 @@
|
||||
|
||||
/datum/category_item/player_setup_item/vore/egg/load_character(var/savefile/S)
|
||||
S["vore_egg_type"] >> pref.vore_egg_type
|
||||
S["autohiss"] >> pref.autohiss // VOREStation Add
|
||||
|
||||
/datum/category_item/player_setup_item/vore/egg/save_character(var/savefile/S)
|
||||
S["vore_egg_type"] << pref.vore_egg_type
|
||||
S["autohiss"] << pref.autohiss // VOREStation Add
|
||||
|
||||
/datum/category_item/player_setup_item/vore/egg/sanitize_character()
|
||||
pref.vore_egg_type = sanitize_inlist(pref.vore_egg_type, global_vore_egg_types, initial(pref.vore_egg_type))
|
||||
|
||||
/datum/category_item/player_setup_item/vore/egg/copy_to_mob(var/mob/living/carbon/human/character)
|
||||
character.vore_egg_type = pref.vore_egg_type
|
||||
// VOREStation Add
|
||||
if(pref.client) // Safety, just in case so we don't runtime.
|
||||
if(!pref.autohiss)
|
||||
pref.client.autohiss_mode = AUTOHISS_FULL
|
||||
else
|
||||
switch(pref.autohiss)
|
||||
if("Full")
|
||||
pref.client.autohiss_mode = AUTOHISS_FULL
|
||||
if("Basic")
|
||||
pref.client.autohiss_mode = AUTOHISS_BASIC
|
||||
if("Off")
|
||||
pref.client.autohiss_mode = AUTOHISS_OFF
|
||||
// VOREStation Add
|
||||
|
||||
/datum/category_item/player_setup_item/vore/egg/content(var/mob/user)
|
||||
. += "<br>"
|
||||
. += " Egg Type: <a href='?src=\ref[src];vore_egg_type=1'>[pref.vore_egg_type]</a><br>"
|
||||
. += "<b>Autohiss Default Setting:</b> <a href='?src=\ref[src];autohiss=1'>[pref.autohiss]</a><br>" // VOREStation Add
|
||||
|
||||
/datum/category_item/player_setup_item/vore/egg/OnTopic(var/href, var/list/href_list, var/mob/user)
|
||||
if(!CanUseTopic(user))
|
||||
@@ -33,5 +56,21 @@
|
||||
if(selection)
|
||||
pref.vore_egg_type = selection
|
||||
return TOPIC_REFRESH
|
||||
// VOREStation Add Start
|
||||
else if(href_list["autohiss"])
|
||||
var/list/autohiss_selection = list("Full", "Basic", "Off")
|
||||
var/selection = tgui_input_list(user, "Choose your default autohiss setting:", "Character Preference", autohiss_selection, pref.autohiss)
|
||||
if(selection)
|
||||
pref.autohiss = selection
|
||||
else if(!selection)
|
||||
pref.autohiss = "Full"
|
||||
return TOPIC_REFRESH
|
||||
// VOREStation Add End
|
||||
else
|
||||
return
|
||||
|
||||
// VOREStation Add Start: Doing this here bc AUTOHISS_FULL is more readable than #
|
||||
#undef AUTOHISS_OFF
|
||||
#undef AUTOHISS_BASIC
|
||||
#undef AUTOHISS_FULL
|
||||
// VOREStation Add End
|
||||
|
||||
@@ -99,6 +99,7 @@
|
||||
list(pick(/obj/item/weapon/grenade/spawnergrenade/spesscarp, /obj/item/weapon/grenade/spawnergrenade/spider, /obj/item/weapon/grenade/explosive/frag), 7) = 1,
|
||||
list(/obj/item/weapon/grenade/flashbang/clusterbang, 7) = 1,
|
||||
list(/obj/item/weapon/card/emag, 11) = 1,
|
||||
list(/obj/item/weapon/melee/shock_maul, 11) = 5,
|
||||
list(/obj/item/weapon/storage/backpack/sport/hyd/catchemall, 11) = 1
|
||||
))
|
||||
var/path = choice[1]
|
||||
|
||||
@@ -97,6 +97,21 @@
|
||||
new outcropdrop(get_turf(src))
|
||||
qdel(src)
|
||||
return
|
||||
if (istype(W, /obj/item/weapon/melee/shock_maul))
|
||||
var/obj/item/weapon/melee/shock_maul/S = W
|
||||
if(!S.wielded || !S.status)
|
||||
to_chat(user, "<span class='warning'>\The [src] must be wielded in two hands and powered on to be used for mining!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You pulverize \the [src]!</span>")
|
||||
for(var/i=0;i<(rand(mindrop,upperdrop));i++)
|
||||
new outcropdrop(get_turf(src))
|
||||
playsound(src, 'sound/weapons/resonator_blast.ogg', 100, 1, -1)
|
||||
user.visible_message("<span class='warning'>\The [S] discharges with a thunderous, hair-raising crackle!</span>")
|
||||
S.deductcharge()
|
||||
S.status = 0
|
||||
S.update_held_icon()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/random/outcrop //In case you want an outcrop without pre-determining the type of ore.
|
||||
name = "random rock outcrop"
|
||||
|
||||
@@ -371,7 +371,6 @@ var/list/mining_overlay_cache = list()
|
||||
valid_tool = 1
|
||||
digspeed = P.digspeed
|
||||
|
||||
|
||||
if(valid_tool)
|
||||
if (sand_dug)
|
||||
to_chat(user, "<span class='warning'>This area has already been dug.</span>")
|
||||
@@ -442,6 +441,51 @@ var/list/mining_overlay_cache = list()
|
||||
to_chat(user, "<span class='notice'>\The [src] has been excavated to a depth of [excavation_level]cm.</span>")
|
||||
return
|
||||
|
||||
if (istype(W, /obj/item/weapon/melee/shock_maul))
|
||||
if(!istype(user.loc, /turf))
|
||||
return
|
||||
|
||||
var/obj/item/weapon/melee/shock_maul/S = W
|
||||
if(!S.wielded || !S.status) //if we're not wielded OR not powered up, do nothing
|
||||
to_chat(user, "<span class='warning'>\The [src] must be wielded in two hands and powered on to be used for mining!</span>")
|
||||
return
|
||||
|
||||
var/newDepth = excavation_level + S.excavation_amount // Used commonly below
|
||||
|
||||
//handle any archaeological finds we might uncover
|
||||
var/fail_message = ""
|
||||
if(finds && finds.len)
|
||||
var/datum/find/F = finds[1]
|
||||
if(newDepth > F.excavation_required) // Digging too deep can break the item. At least you won't summon a Balrog (probably)
|
||||
fail_message = ". <b>[pick("There is a crunching noise","[S] collides with some different rock","Part of the rock face crumbles away","Something breaks under [S]")]</b>"
|
||||
wreckfinds(S.destroy_artefacts)
|
||||
|
||||
to_chat(user, "<span class='notice'>You smash through \the [src][fail_message].</span>")
|
||||
|
||||
if(newDepth >= 200) // This means the rock is mined out fully
|
||||
if(S.destroy_artefacts)
|
||||
GetDrilled(0)
|
||||
else
|
||||
excavate_turf()
|
||||
return
|
||||
|
||||
excavation_level += S.excavation_amount
|
||||
update_archeo_overlays(S.excavation_amount)
|
||||
|
||||
//drop some rocks
|
||||
next_rock += S.excavation_amount
|
||||
while(next_rock > 50)
|
||||
next_rock -= 50
|
||||
var/obj/item/weapon/ore/O = new(src)
|
||||
geologic_data.UpdateNearbyArtifactInfo(src)
|
||||
O.geologic_data = geologic_data
|
||||
|
||||
user.visible_message("<span class='warning'>\The [src] discharges with a thunderous, hair-raising crackle!</span>")
|
||||
playsound(src, 'sound/weapons/resonator_blast.ogg', 100, 1, -1)
|
||||
S.deductcharge()
|
||||
S.status = 0
|
||||
S.update_held_icon()
|
||||
|
||||
if (istype(W, /obj/item/weapon/pickaxe))
|
||||
if(!istype(user.loc, /turf))
|
||||
return
|
||||
|
||||
@@ -1,5 +1,30 @@
|
||||
// VOREStation Add Start: Doing this here bc AUTOHISS_FULL is more readable than #
|
||||
#define AUTOHISS_OFF 0
|
||||
#define AUTOHISS_BASIC 1
|
||||
#define AUTOHISS_FULL 2
|
||||
// VOREStation Add End
|
||||
|
||||
/mob/living/carbon/human/Login()
|
||||
..()
|
||||
update_hud()
|
||||
// VOREStation Add
|
||||
if(client.prefs) // Safety, just in case so we don't runtime.
|
||||
if(!client.prefs.autohiss)
|
||||
client.autohiss_mode = AUTOHISS_FULL
|
||||
else
|
||||
switch(client.prefs.autohiss)
|
||||
if("Full")
|
||||
client.autohiss_mode = AUTOHISS_FULL
|
||||
if("Basic")
|
||||
client.autohiss_mode = AUTOHISS_BASIC
|
||||
if("Off")
|
||||
client.autohiss_mode = AUTOHISS_OFF
|
||||
// VOREStation Add
|
||||
if(species) species.handle_login_special(src)
|
||||
return
|
||||
return
|
||||
|
||||
// VOREStation Add Start: Doing this here bc AUTOHISS_FULL is more readable than #
|
||||
#undef AUTOHISS_OFF
|
||||
#undef AUTOHISS_BASIC
|
||||
#undef AUTOHISS_FULL
|
||||
// VOREStation Add End
|
||||
|
||||
@@ -145,32 +145,25 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
|
||||
var/matrix/M = matrix()
|
||||
var/anim_time = 3
|
||||
|
||||
// VOREStation Edit Start: Porting Taur Loafing
|
||||
if(tail_style?.can_loaf && resting) // Only call these if we're resting?
|
||||
update_tail_showing()
|
||||
return // No need to do the rest, we return early
|
||||
/* // Commenting this out as sleeping is fucky
|
||||
if(tail_style?.can_loaf && lying && sleeping) // If we're put under by anesthetic or fainting
|
||||
update_tail_showing()
|
||||
// return // No need to do the rest, we return early
|
||||
*/
|
||||
// VOREStation Edit End
|
||||
|
||||
//Due to some involuntary means, you're laying now
|
||||
if(lying && !resting && !sleeping)
|
||||
anim_time = 1 //Thud
|
||||
|
||||
if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone.
|
||||
var/randn = rand(1, 2)
|
||||
if(randn <= 1) // randomly choose a rotation
|
||||
M.Turn(-90)
|
||||
if(tail_style?.can_loaf && resting) // Only call these if we're resting?
|
||||
update_tail_showing()
|
||||
M.Scale(desired_scale_x, desired_scale_y)
|
||||
else
|
||||
M.Turn(90)
|
||||
M.Scale(desired_scale_y, desired_scale_x)//VOREStation Edit
|
||||
if(species.icon_height == 64)//VOREStation Edit
|
||||
M.Translate(13,-22)
|
||||
else
|
||||
M.Translate(1,-6)
|
||||
var/randn = rand(1, 2)
|
||||
if(randn <= 1) // randomly choose a rotation
|
||||
M.Turn(-90)
|
||||
else
|
||||
M.Turn(90)
|
||||
if(species.icon_height == 64)
|
||||
M.Translate(13,-22)
|
||||
else
|
||||
M.Translate(1,-6)
|
||||
M.Scale(desired_scale_y, desired_scale_x)
|
||||
layer = MOB_LAYER -0.01 // Fix for a byond bug where turf entry order no longer matters
|
||||
else
|
||||
M.Scale(desired_scale_x, desired_scale_y)//VOREStation Edit
|
||||
@@ -1270,13 +1263,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
|
||||
|
||||
//If you have a custom tail selected
|
||||
if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !istaurtail(tail_style)) && !tail_hidden)
|
||||
var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = (tail_style.can_loaf && resting) ? "[tail_style.icon_state]_loaf" : (wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state)) // VOREStation Edit: Taur Loafing
|
||||
var/icon/tail_s = new/icon("icon" = (tail_style.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = (wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state)) //CHOMPEdit
|
||||
if(tail_style.can_loaf && !is_shifted)
|
||||
pixel_y = (resting) ? -tail_style.loaf_offset*size_multiplier : default_pixel_y //move player down, then taur up, to fit the overlays correctly // VOREStation Edit: Taur Loafing
|
||||
if(tail_style.do_colouration)
|
||||
tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode)
|
||||
if(tail_style.extra_overlay)
|
||||
var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = (tail_style?.can_loaf && resting) ? "[tail_style.extra_overlay]_loaf" : tail_style.extra_overlay) // VOREStation Edit: Taur Loafing
|
||||
var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay) //CHOMPEdit
|
||||
if(wagging && tail_style.ani_state)
|
||||
overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay_w)
|
||||
overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode)
|
||||
@@ -1288,7 +1281,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
|
||||
qdel(overlay)
|
||||
|
||||
if(tail_style.extra_overlay2)
|
||||
var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2)
|
||||
var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2) //CHOMPEdit
|
||||
if(wagging && tail_style.ani_state)
|
||||
overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2_w)
|
||||
overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode)
|
||||
@@ -1306,7 +1299,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
|
||||
if(istaurtail(tail_style))
|
||||
var/datum/sprite_accessory/tail/taur/taurtype = tail_style
|
||||
working.pixel_x = -16
|
||||
working.pixel_y = (tail_style.can_loaf && resting) ? tail_style.loaf_offset : 0 // VOREStation Edit: Taur Loafing
|
||||
if(taurtype.can_ride && !riding_datum)
|
||||
riding_datum = new /datum/riding/taur(src)
|
||||
verbs |= /mob/living/carbon/human/proc/taur_mount
|
||||
|
||||
@@ -46,7 +46,8 @@
|
||||
"catslug",
|
||||
"car",
|
||||
"typeone",
|
||||
"13"
|
||||
"13",
|
||||
"pai-raptor"
|
||||
)
|
||||
//These vars keep track of whether you have the related software, used for easily updating the UI
|
||||
var/soft_ut = FALSE //universal translator
|
||||
|
||||
@@ -14,9 +14,14 @@
|
||||
handle_attack_delay(A, melee_attack_delay) // This will sleep this proc for a bit, which is why waitfor is false.
|
||||
|
||||
// Cooldown testing is done at click code (for players) and interface code (for AI).
|
||||
setClickCooldown(get_attack_speed())
|
||||
// VOREStation Edit Start: Simplemob Injury
|
||||
if(injury_enrages)
|
||||
setClickCooldown(get_attack_speed() - ((injury_level / 2) SECONDS)) // Increase how fast we can attack by our injury level / 2
|
||||
else
|
||||
setClickCooldown(get_attack_speed() + ((injury_level / 2) SECONDS)) // Delay how fast we can attack by our injury level / 2
|
||||
// VOREStation Edit Stop: Simplemob Injury
|
||||
|
||||
// Returns a value, but will be lost if
|
||||
// Returns a value, but will be lost if
|
||||
. = do_attack(A, their_T)
|
||||
|
||||
if(melee_attack_delay)
|
||||
@@ -90,7 +95,12 @@
|
||||
if(!istype(A) || QDELETED(A))
|
||||
return
|
||||
|
||||
setClickCooldown(get_attack_speed())
|
||||
// VOREStation Edit Start: Simplemob Injury
|
||||
if(injury_enrages)
|
||||
setClickCooldown(get_attack_speed() - ((injury_level / 2) SECONDS)) // Increase how fast we can attack by our injury level / 2
|
||||
else
|
||||
setClickCooldown(get_attack_speed() + ((injury_level / 2) SECONDS)) // Delay how fast we can attack by our injury level / 2
|
||||
// VOREStation Edit Stop: Simplemob Injury
|
||||
|
||||
face_atom(A)
|
||||
|
||||
@@ -259,4 +269,4 @@
|
||||
/mob/living/simple_mob/proc/special_pre_animation(atom/A)
|
||||
do_windup_animation(A, special_attack_delay) // Semi-placeholder.
|
||||
|
||||
/mob/living/simple_mob/proc/special_post_animation(atom/A)
|
||||
/mob/living/simple_mob/proc/special_post_animation(atom/A)
|
||||
|
||||
@@ -165,17 +165,22 @@
|
||||
var/limb_icon_key
|
||||
var/understands_common = TRUE //VOREStation Edit - Makes it so that simplemobs can understand galcomm without being able to speak it.
|
||||
var/heal_countdown = 5 //VOREStation Edit - A cooldown ticker for passive healing
|
||||
var/obj/item/weapon/card/id/mobcard = null //VOREStation Edit
|
||||
var/list/mobcard_access = list() //VOREStation Edit
|
||||
var/mobcard_provided = FALSE //VOREStation Edit
|
||||
var/list/myid_access = list() //VOREStation Edit
|
||||
var/ID_provided = FALSE //VOREStation Edit
|
||||
// VOREStation Add: Move/Shoot/Attack delays based on damage
|
||||
var/damage_fatigue_mult = 0 // Our multiplier for how heavily mobs are affected by injury. [UPDATE THIS IF THE FORMULA CHANGES]: Formula = injury_level = round(rand(1,3) * damage_fatigue_mult * clamp(((rand(2,5) * (h / getMaxHealth())) - rand(0,2)), 1, 5))
|
||||
var/injury_level = 0 // What our injury level is. Rather than being the flat damage, this is the amount added to various delays to simulate injuries in a manner as lightweight as possible.
|
||||
var/threshold = 0.6 // When we start slowing down. Configure this setting per-mob. Default is 60%
|
||||
var/injury_enrages = FALSE // Do injuries enrage (aka strengthen) our mob? If yes, we'll interpret how hurt we are differently.
|
||||
// VOREStation Add End
|
||||
|
||||
/mob/living/simple_mob/Initialize()
|
||||
verbs -= /mob/verb/observe
|
||||
health = maxHealth
|
||||
|
||||
if(mobcard_provided) //VOREStation Edit
|
||||
mobcard = new /obj/item/weapon/card/id(src)
|
||||
mobcard.access = mobcard_access.Copy()
|
||||
if(ID_provided) //VOREStation Edit
|
||||
myid = new /obj/item/weapon/card/id(src)
|
||||
myid.access = myid_access.Copy()
|
||||
|
||||
for(var/L in has_langs)
|
||||
languages |= GLOB.all_languages[L]
|
||||
@@ -259,6 +264,13 @@
|
||||
if(m_intent == "walk")
|
||||
. *= 1.5
|
||||
|
||||
// VOREStation Edit Start
|
||||
if(injury_enrages) // If we enrage, then do this, else
|
||||
. -= injury_level
|
||||
else
|
||||
. += injury_level
|
||||
// VOREStation Edit Stop
|
||||
|
||||
. += config.animal_delay
|
||||
|
||||
. += ..()
|
||||
@@ -308,12 +320,20 @@
|
||||
/decl/mob_organ_names
|
||||
var/list/hit_zones = list("body") //When in doubt, it's probably got a body.
|
||||
|
||||
//VOREStation Add Start For allowing mobs with ID's door access
|
||||
/mob/living/simple_mob/Bump(var/atom/A)
|
||||
if(mobcard && istype(A, /obj/machinery/door))
|
||||
var/obj/machinery/door/D = A
|
||||
if(client && !istype(D, /obj/machinery/door/firedoor) && !istype(D, /obj/machinery/door/blast) && !istype(D, /obj/machinery/door/airlock/lift) && D.check_access(mobcard))
|
||||
D.open()
|
||||
else
|
||||
..()
|
||||
//Vorestation Add End
|
||||
/*
|
||||
* VOREStation Add
|
||||
* How injured are we? Returns a number that is then added to movement cooldown and firing/melee delay respectively.
|
||||
* Called by movement_delay and our firing/melee delay checks
|
||||
*/
|
||||
/mob/living/simple_mob/proc/get_injury_level(var/mob/living/simple_mob/M)
|
||||
var/h = getMaxHealth() - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() - halloss // We're not updating our actual health here bc we want updatehealth() and other checks to handle that
|
||||
if(h > 0) // Safety to prevent division by 0 errors
|
||||
if((h / getMaxHealth()) <= threshold) // Essentially, did our health go down? We don't modify want to modify our total slowdown if we didn't actually take damage, and aren't below our threshold %
|
||||
var/totaldelay = round(rand(1,3) * damage_fatigue_mult * clamp(((rand(2,5) * (h / getMaxHealth())) - rand(0,2)), 1, 5)) // totaldelay is how much delay we're going to feed into attacks and movement. Do NOT change this formula unless you know how to math.
|
||||
injury_level = totaldelay // Adds our returned slowdown to the mob's injury level
|
||||
|
||||
/mob/living/simple_mob/updatehealth() // We don't want to fully override the check, just hook our own code in
|
||||
get_injury_level() // We check how injured we are, then actually update the mob on how hurt we are.
|
||||
. = ..() // Calling parent here, actually updating our mob on how hurt we are.
|
||||
|
||||
// VOREStation Add End
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
friendly = list("hugs")
|
||||
see_in_dark = 8
|
||||
|
||||
mobcard_provided = TRUE
|
||||
ID_provided = TRUE
|
||||
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug)
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/catslug
|
||||
@@ -426,7 +426,7 @@
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/engislug)
|
||||
holder_type = /obj/item/weapon/holder/catslug/custom/engislug
|
||||
say_list_type = /datum/say_list/catslug/custom/engislug
|
||||
mobcard_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_construction, access_atmospherics)
|
||||
myid_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_construction, access_atmospherics)
|
||||
siemens_coefficient = 0 //Noodly fella's gone and built up an immunity from many small shocks
|
||||
|
||||
minbodytemp = 200
|
||||
@@ -543,7 +543,7 @@
|
||||
"bio" = 0,
|
||||
"rad" = 0
|
||||
) //Similarly, \some\ armour values for a smidge more survivability compared to other catslugs.
|
||||
mobcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_maint_tunnels)
|
||||
myid_access = list(access_security, access_sec_doors, access_forensics_lockers, access_maint_tunnels)
|
||||
|
||||
/datum/say_list/catslug/custom/gatslug
|
||||
speak = list("Have any flashbangs?", "Valids!", "Heard spiders?", "What is that?", "Freeze!", "What are you doing?", "How did you get here?", "Red alert means big bangsticks.", "No being naughty now.", "WAOW!", "Who ate all the donuts?")
|
||||
@@ -580,7 +580,7 @@
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/medislug)
|
||||
holder_type = /obj/item/weapon/holder/catslug/custom/medislug
|
||||
say_list_type = /datum/say_list/catslug/custom/medislug
|
||||
mobcard_access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
||||
myid_access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
||||
|
||||
/datum/say_list/catslug/custom/medislug
|
||||
speak = list("Have any osteodaxon?", "What is that?", "Suit sensors!", "What are you doing?", "How did you get here?", "Put a mask on!", "No smoking!", "WAOW!", "Stop getting blood everywhere!", "WHERE IN MAINT?")
|
||||
@@ -616,7 +616,7 @@
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/scienceslug)
|
||||
holder_type = /obj/item/weapon/holder/catslug/custom/scienceslug
|
||||
say_list_type = /datum/say_list/catslug/custom/scienceslug
|
||||
mobcard_access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
|
||||
myid_access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
|
||||
|
||||
|
||||
/datum/say_list/catslug/custom/scienceslug
|
||||
@@ -654,7 +654,7 @@
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/cargoslug)
|
||||
holder_type = /obj/item/weapon/holder/catslug/custom/cargoslug
|
||||
say_list_type = /datum/say_list/catslug/custom/cargoslug
|
||||
mobcard_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
|
||||
myid_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
|
||||
|
||||
/datum/say_list/catslug/custom/cargoslug
|
||||
speak = list("Disposals is not for slip and slide.", "What is that?", "Stamp those manifests!", "What are you doing?", "How did you get here?", "Can order pizza crate?", "WAOW!", "Where are all of our materials?", "Got glubbs?")
|
||||
@@ -693,7 +693,7 @@
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug/custom/capslug)
|
||||
holder_type = /obj/item/weapon/holder/catslug/custom/capslug
|
||||
say_list_type = /datum/say_list/catslug/custom/capslug
|
||||
mobcard_access = list(access_maint_tunnels) //The all_station_access part below adds onto this.
|
||||
myid_access = list(access_maint_tunnels) //The all_station_access part below adds onto this.
|
||||
|
||||
/datum/say_list/catslug/custom/capslug
|
||||
speak = list("How open big glass box with shiny inside?.", "What is that?", "Respect my authority!", "What are you doing?", "How did you get here?", "Fax for yellow-shirts!", "WAOW!", "Why is that console blinking and clicking?", "Do we need to call for ERT?", "Have been called comdom before, not sure why they thought I was a balloon.")
|
||||
@@ -708,7 +708,7 @@
|
||||
mob_radio.ks2type = /obj/item/device/encryptionkey/heads/captain //Might not be able to speak, but the catslug can listen.
|
||||
mob_radio.keyslot2 = new /obj/item/device/encryptionkey/heads/captain(mob_radio)
|
||||
mob_radio.recalculateChannels(1)
|
||||
mobcard.access |= get_all_station_access()
|
||||
myid.access |= get_all_station_access()
|
||||
|
||||
//=============================================================================
|
||||
//Admin-spawn only catslugs below - Expect overpowered things & silliness below
|
||||
@@ -725,7 +725,7 @@
|
||||
icon_dead = "deathslug_dead"
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug) //So they don't get the spaceslug's cataloguer entry
|
||||
say_list_type = /datum/say_list/catslug //Similarly, so they don't get the spaceslug's speech lines.
|
||||
mobcard_access = list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
|
||||
myid_access = list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
|
||||
maxHealth = 100 //Tough noodles
|
||||
health = 100
|
||||
taser_kill = 0
|
||||
@@ -750,7 +750,7 @@
|
||||
. = ..()
|
||||
mob_radio = new /obj/item/device/radio/headset/mob_headset(src)
|
||||
mob_radio.frequency = DTH_FREQ //Can't tell if bugged, deathsquad freq in general seems broken
|
||||
mobcard.access |= get_all_station_access()
|
||||
myid.access |= get_all_station_access()
|
||||
|
||||
//Syndicate catslug
|
||||
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/syndislug
|
||||
@@ -763,7 +763,7 @@
|
||||
icon_dead = "syndislug_dead"
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug)
|
||||
say_list_type = /datum/say_list/catslug
|
||||
mobcard_access = list(access_maint_tunnels, access_syndicate, access_external_airlocks)
|
||||
myid_access = list(access_maint_tunnels, access_syndicate, access_external_airlocks)
|
||||
faction = "syndicate"
|
||||
maxHealth = 100 //Tough noodles
|
||||
health = 100
|
||||
@@ -795,7 +795,7 @@
|
||||
mob_radio.ks2type = /obj/item/device/encryptionkey/syndicate
|
||||
mob_radio.keyslot2 = new /obj/item/device/encryptionkey/syndicate(mob_radio)
|
||||
mob_radio.recalculateChannels(1)
|
||||
mobcard.access |= get_all_station_access()
|
||||
myid.access |= get_all_station_access()
|
||||
|
||||
//ERT catslug
|
||||
/mob/living/simple_mob/vore/alienanimals/catslug/custom/spaceslug/responseslug
|
||||
@@ -808,7 +808,7 @@
|
||||
icon_dead = "responseslug_dead"
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/catslug)
|
||||
say_list_type = /datum/say_list/catslug
|
||||
mobcard_access = list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
|
||||
myid_access = list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
|
||||
maxHealth = 100 //Tough noodles
|
||||
health = 100
|
||||
taser_kill = 0
|
||||
@@ -839,7 +839,7 @@
|
||||
mob_radio.ks2type = /obj/item/device/encryptionkey/ert
|
||||
mob_radio.keyslot2 = new /obj/item/device/encryptionkey/ert(mob_radio)
|
||||
mob_radio.recalculateChannels(1)
|
||||
mobcard.access |= get_all_station_access()
|
||||
myid.access |= get_all_station_access()
|
||||
|
||||
//Pilot Catslug
|
||||
|
||||
|
||||
@@ -616,6 +616,12 @@
|
||||
var/datum/language/keylang = GLOB.all_languages[client.prefs.language_custom_keys[key]]
|
||||
if(keylang)
|
||||
new_character.language_keys[key] = keylang
|
||||
// VOREStation Add: Preferred Language Setting;
|
||||
if(client.prefs.preferred_language) // Do we have a preferred language?
|
||||
var/datum/language/def_lang = GLOB.all_languages[client.prefs.preferred_language]
|
||||
if(def_lang)
|
||||
new_character.default_language = def_lang
|
||||
// VOREStation Add End
|
||||
// And uncomment this, too.
|
||||
//new_character.dna.UpdateSE()
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
|
||||
|
||||
var/list/lower_layer_dirs = list(SOUTH)
|
||||
var/icon_loaf = null
|
||||
|
||||
/datum/sprite_accessory/tail/New()
|
||||
. = ..()
|
||||
|
||||
@@ -56,11 +56,15 @@
|
||||
under_sprites = 'icons/mob/taursuits_wolf_vr.dmi'
|
||||
suit_sprites = 'icons/mob/taursuits_wolf_vr.dmi'
|
||||
icon_sprite_tag = "wolf"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 4
|
||||
|
||||
/datum/sprite_accessory/tail/taur/wolf/fatwolf
|
||||
name = "Fat Wolf (Taur)"
|
||||
icon_state = "fatwolf_s"
|
||||
//icon_sprite_tag = "wolf" //This could be modified later.
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/wolf/wolf_wag
|
||||
name = "Wolf (Taur, Fat vwag)"
|
||||
@@ -76,19 +80,22 @@
|
||||
|
||||
/datum/sprite_accessory/tail/taur/wolf/fatwolf_2c
|
||||
name = "Fat Wolf 3-color (Taur)"
|
||||
icon = 'icons/mob/vore/taurs_ch.dmi' //CHOMPEdit
|
||||
icon_state = "fatwolf_s"
|
||||
extra_overlay = "fatwolf_markings"
|
||||
extra_overlay2 = "wolf_markings_2"
|
||||
extra_overlay2 = "fatwolf_markings_2" //CHOMPEdit
|
||||
//icon_sprite_tag = "fatwolf2c"
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/wolf/wolf_2c_wag
|
||||
name = "Wolf 3-color (Taur, Fat vwag)"
|
||||
icon = 'icons/mob/vore/taurs_ch.dmi' //CHOMPEdit
|
||||
icon_state = "wolf_s"
|
||||
extra_overlay = "wolf_markings"
|
||||
extra_overlay2 = "wolf_markings_2"
|
||||
ani_state = "fatwolf_s"
|
||||
extra_overlay_w = "fatwolf_markings"
|
||||
extra_overlay2_w = "wolf_markings_2"
|
||||
extra_overlay2_w = "fatwolf_markings_2" //CHOMPEdit
|
||||
|
||||
/datum/sprite_accessory/tail/taur/wolf/synthwolf
|
||||
name = "SynthWolf dual-color (Taur)"
|
||||
@@ -96,12 +103,14 @@
|
||||
extra_overlay = "synthwolf_markings"
|
||||
extra_overlay2 = "synthwolf_glow"
|
||||
//icon_sprite_tag = "synthwolf"
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/wolf/fatsynthwolf
|
||||
name = "Fat SynthWolf dual-color (Taur)"
|
||||
icon_state = "fatsynthwolf_s"
|
||||
extra_overlay = "fatsynthwolf_markings"
|
||||
extra_overlay2 = "fatsynthwolf_glow"
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/wolf/fatsynthwolf_wag
|
||||
name = "SynthWolf dual-color (Taur, Fat vwag)"
|
||||
@@ -118,6 +127,9 @@
|
||||
extra_overlay = "skunk_markings"
|
||||
extra_overlay2 = "skunk_markings_2"
|
||||
icon_sprite_tag = "skunk"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/naga
|
||||
name = "Naga (Taur)"
|
||||
@@ -192,6 +204,9 @@
|
||||
under_sprites = 'icons/mob/taursuits_horse_vr.dmi'
|
||||
suit_sprites = 'icons/mob/taursuits_horse_vr.dmi'
|
||||
icon_sprite_tag = "horse"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 4
|
||||
|
||||
msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!"
|
||||
msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!"
|
||||
@@ -214,12 +229,18 @@
|
||||
extra_overlay = "synthhorse_markings"
|
||||
extra_overlay2 = "synthhorse_glow"
|
||||
//icon_sprite_tag = "synthhorse"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/cow
|
||||
name = "Cow (Taur)"
|
||||
icon_state = "cow_s"
|
||||
suit_sprites = 'icons/mob/taursuits_cow_vr.dmi'
|
||||
icon_sprite_tag = "cow"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 3
|
||||
|
||||
msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!"
|
||||
msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!"
|
||||
@@ -242,6 +263,9 @@
|
||||
extra_overlay = "deer_markings"
|
||||
suit_sprites = 'icons/mob/taursuits_deer_vr.dmi'
|
||||
icon_sprite_tag = "deer"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 6
|
||||
|
||||
msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!"
|
||||
msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!"
|
||||
@@ -261,12 +285,19 @@
|
||||
/datum/sprite_accessory/tail/taur/lizard
|
||||
name = "Lizard (Taur)"
|
||||
icon_state = "lizard_s"
|
||||
suit_sprites = 'icons/mob/taursuits_lizard_vr.dmi'
|
||||
// suit_sprites = 'icons/mob/taursuits_lizard_vr.dmi' ///Chomp edit
|
||||
suit_sprites = 'icons/mob/taursuits_lizard_ch.dmi'
|
||||
icon_sprite_tag = "lizard"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 5
|
||||
|
||||
/datum/sprite_accessory/tail/taur/lizard/fatlizard
|
||||
name = "Fat Lizard (Taur)"
|
||||
icon_state = "fatlizard_s"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/lizard/lizard_wag
|
||||
name = "Lizard (Taur, Fat vwag)"
|
||||
@@ -278,11 +309,17 @@
|
||||
icon_state = "lizard_s"
|
||||
extra_overlay = "lizard_markings"
|
||||
//icon_sprite_tag = "lizard2c"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 5
|
||||
|
||||
/datum/sprite_accessory/tail/taur/lizard/fatlizard_2c
|
||||
name = "Fat Lizard (Taur, dual-color)"
|
||||
icon_state = "fatlizard_s"
|
||||
extra_overlay = "fatlizard_markings"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/lizard/lizard_2c_wag
|
||||
name = "Fat Lizard (Taur, dual-color, Fat vwag)"
|
||||
@@ -297,12 +334,18 @@
|
||||
extra_overlay = "synthlizard_markings"
|
||||
extra_overlay2 = "synthlizard_glow"
|
||||
//icon_sprite_tag = "synthlizard"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/lizard/fatsynthlizard
|
||||
name = "Fat SynthLizard dual-color (Taur)"
|
||||
icon_state = "fatsynthlizard_s"
|
||||
extra_overlay = "fatsynthlizard_markings"
|
||||
extra_overlay2 = "fatsynthlizard_glow"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/lizard/synthlizard_wag
|
||||
name = "SynthLizard dual-color (Taur, Fat vwag)"
|
||||
@@ -366,16 +409,25 @@
|
||||
icon_state = "feline_s"
|
||||
suit_sprites = 'icons/mob/taursuits_feline_vr.dmi'
|
||||
icon_sprite_tag = "feline"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 5
|
||||
|
||||
/datum/sprite_accessory/tail/taur/fatfeline
|
||||
name = "Fat Feline (Taur)"
|
||||
icon_state = "fatfeline_s"
|
||||
//icon_sprite_tag = "fatfeline"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/fatfeline_wag
|
||||
name = "Fat Feline (Taur, Fat vwag)"
|
||||
icon_state = "fatfeline_s"
|
||||
ani_state = "fatfeline_w"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/feline/feline_2c
|
||||
name = "Feline 3-color (Taur)"
|
||||
@@ -383,22 +435,30 @@
|
||||
extra_overlay = "feline_markings"
|
||||
extra_overlay2 = "feline_markings_2"
|
||||
//icon_sprite_tag = "feline2c"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
|
||||
/datum/sprite_accessory/tail/taur/feline/fatfeline_2c
|
||||
name = "Fat Feline 3-color (Taur)"
|
||||
icon = 'icons/mob/vore/taurs_ch.dmi' //CHOMPEdit
|
||||
icon_state = "fatfeline_s"
|
||||
extra_overlay = "fatfeline_markings"
|
||||
extra_overlay2 = "feline_markings_2"
|
||||
extra_overlay2 = "fatfeline_markings_2" //CHOMPEdit
|
||||
//icon_sprite_tag = "fatfeline2c"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/feline/feline_2c_wag
|
||||
name = "Feline 3-color (Taur, Fat vwag)"
|
||||
icon = 'icons/mob/vore/taurs_ch.dmi' //CHOMPEdit
|
||||
icon_state = "feline_s"
|
||||
extra_overlay = "feline_markings"
|
||||
extra_overlay2 = "feline_markings_2"
|
||||
ani_state = "fatfeline_s"
|
||||
extra_overlay_w = "fatfeline_markings"
|
||||
extra_overlay2_w = "feline_markings_2"
|
||||
extra_overlay2_w = "fatfeline_markings_2" //CHOMPEdit
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/feline/synthfeline
|
||||
name = "SynthFeline dual-color (Taur)"
|
||||
@@ -406,12 +466,18 @@
|
||||
extra_overlay = "synthfeline_markings"
|
||||
extra_overlay2 = "synthfeline_glow"
|
||||
//icon_sprite_tag = "synthfeline"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/feline/fatsynthfeline
|
||||
name = "Fat SynthFeline dual-color (Taur)"
|
||||
icon_state = "fatsynthfeline_s"
|
||||
extra_overlay = "fatsynthfeline_markings"
|
||||
extra_overlay2 = "fatsynthfeline_glow"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 3
|
||||
|
||||
/datum/sprite_accessory/tail/taur/feline/synthfeline_wag
|
||||
name = "SynthFeline dual-color (Taur, Fat vwag)"
|
||||
@@ -491,16 +557,20 @@
|
||||
name = "Drake (Taur)"
|
||||
icon_state = "drake_s"
|
||||
extra_overlay = "drake_markings"
|
||||
suit_sprites = 'icons/mob/taursuits_drake_vr.dmi'
|
||||
/// suit_sprites = 'icons/mob/taursuits_drake_vr.dmi' ///Chomp edit
|
||||
suit_sprites = 'icons/mob/taursuits_drake_ch.dmi'
|
||||
icon_sprite_tag = "drake"
|
||||
can_loaf = TRUE // VOREStation Edit: Taur Loafing
|
||||
loaf_offset = 6 // VOREStation Edit: Taur Loafing
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 6
|
||||
|
||||
/datum/sprite_accessory/tail/taur/drake/fat
|
||||
name = "Fat Drake (Taur)"
|
||||
icon_state = "fatdrake_s"
|
||||
extra_overlay = "fatdrake_markings"
|
||||
can_loaf = FALSE
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 6
|
||||
|
||||
/datum/sprite_accessory/tail/taur/drake/drake_vwag
|
||||
name = "Drake (Taur, Fat vwag)"
|
||||
@@ -508,8 +578,7 @@
|
||||
extra_overlay = "drake_markings"
|
||||
ani_state = "fatdrake_s"
|
||||
extra_overlay_w = "fatdrake_markings"
|
||||
can_loaf = FALSE
|
||||
|
||||
can_loaf = TRUE
|
||||
|
||||
/datum/sprite_accessory/tail/taur/otie
|
||||
name = "Otie (Taur)"
|
||||
@@ -518,6 +587,9 @@
|
||||
extra_overlay2 = "otie_markings_2"
|
||||
suit_sprites = 'icons/mob/taursuits_otie_vr.dmi'
|
||||
icon_sprite_tag = "otie"
|
||||
can_loaf = TRUE
|
||||
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
|
||||
loaf_offset = 5
|
||||
|
||||
/datum/sprite_accessory/tail/taur/alraune/alraune_2c
|
||||
name = "Alraune (dual color)"
|
||||
@@ -624,12 +696,14 @@
|
||||
name = "Feline (wickedtemp) (Taur)"
|
||||
icon_state = "tempest_s"
|
||||
ckeys_allowed = list("wickedtemp")
|
||||
can_loaf = FALSE
|
||||
|
||||
//silencedmp5a5: Serdykov Antoz
|
||||
/datum/sprite_accessory/tail/taur/wolf/serdy
|
||||
name = "CyberSerdy (silencedmp5a5) (Taur)"
|
||||
icon_state = "serdy_s"
|
||||
ckeys_allowed = list("silencedmp5a5")
|
||||
can_loaf = FALSE
|
||||
|
||||
//liquidfirefly: Ariana Scol
|
||||
/datum/sprite_accessory/tail/taur/centipede
|
||||
@@ -700,7 +774,7 @@
|
||||
suit_sprites = 'icons/mob/taursuits_noodle_vr.dmi'
|
||||
clip_mask_state = "taur_clip_mask_noodle"
|
||||
icon_sprite_tag = "noodle"
|
||||
|
||||
/* CHOMPEdit - removed as a sprite accessory of the same name already exists for us, and having this here stops it from registering as a sprite accessory.
|
||||
/datum/sprite_accessory/tail/taur/sect_drone
|
||||
name = "Sect Drone (Taur)"
|
||||
icon_state = "sect_drone"
|
||||
@@ -721,11 +795,12 @@
|
||||
|
||||
msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!"
|
||||
msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!"
|
||||
|
||||
*/
|
||||
/datum/sprite_accessory/tail/taur/sect_drone/fat
|
||||
name = "Fat Sect Drone (Taur)"
|
||||
icon_state = "fat_sect_drone"
|
||||
extra_overlay = "fat_sect_drone_markings"
|
||||
icon_sprite_tag = "sect_drone" //CHOMPEdit addition
|
||||
|
||||
/datum/sprite_accessory/tail/taur/sect_drone/drone_wag
|
||||
name = "Sect Drone (Taur, Fat vwag)"
|
||||
@@ -733,6 +808,7 @@
|
||||
extra_overlay = "sect_drone_markings"
|
||||
ani_state = "fat_sect_drone"
|
||||
extra_overlay_w = "fat_sect_drone_markings"
|
||||
icon_sprite_tag = "sect_drone" //CHOMPEdit addition
|
||||
|
||||
/datum/sprite_accessory/tail/taur/giantspider_colorable//these are honestly better fit for vass icontypes whoops
|
||||
name = "Giant Spider dual-color (Taur)"
|
||||
|
||||
@@ -172,6 +172,12 @@
|
||||
var/datum/language/keylang = GLOB.all_languages[ghost_client.prefs.language_custom_keys[key]]
|
||||
if(keylang)
|
||||
new_character.language_keys[key] = keylang
|
||||
// VOREStation Add: Preferred Language Setting;
|
||||
if(ghost_client.prefs.preferred_language) // Do we have a preferred language?
|
||||
var/datum/language/def_lang = GLOB.all_languages[ghost_client.prefs.preferred_language]
|
||||
if(def_lang)
|
||||
new_character.default_language = def_lang
|
||||
// VOREStation Add End
|
||||
|
||||
//If desired, apply equipment.
|
||||
if(equip_body)
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
potential_damage = (melee_damage_lower + melee_damage_upper) / 2
|
||||
|
||||
// Treat potential_damage as estimated DPS. If the enemy attacks twice as fast as usual, it will double the number.
|
||||
potential_damage *= 1 SECOND / (base_attack_cooldown + melee_attack_delay)
|
||||
potential_damage *= 1 SECOND / (base_attack_cooldown + melee_attack_delay + injury_level) // VOREStation Add: Injury level should affect potential damage, thereby increasing the threat level
|
||||
else
|
||||
var/obj/item/projectile/P = new projectiletype(src)
|
||||
if(P.nodamage || P.taser_effect) // Tasers are somewhat less scary.
|
||||
@@ -41,7 +41,7 @@
|
||||
potential_damage += P.agony / 2
|
||||
qdel(P)
|
||||
|
||||
potential_damage *= 1 SECOND / (base_attack_cooldown + ranged_attack_delay)
|
||||
potential_damage *= 1 SECOND / (base_attack_cooldown + ranged_attack_delay + injury_level) // VOREStation Add: Injury level should affect potential damage, thereby increasing the threat level
|
||||
|
||||
// Special attacks are ultra-specific to the mob so a generic threat assessment isn't really possible.
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ var/list/ventcrawl_machinery = list(
|
||||
return 1
|
||||
if(isanimal(src))
|
||||
var/mob/living/simple_mob/S = src
|
||||
if(carried_item == S.mobcard) //VOREStation Edit
|
||||
if(carried_item == S.myid) //VOREStation Edit
|
||||
return 1 //VOREStation Edit
|
||||
//Try to find it in our allowed list (istype includes subtypes)
|
||||
var/listed = FALSE
|
||||
|
||||
@@ -166,6 +166,12 @@ Please do not abuse this ability.
|
||||
var/datum/language/keylang = GLOB.all_languages[prey.prefs.language_custom_keys[key]]
|
||||
if(keylang)
|
||||
new_character.language_keys[key] = keylang
|
||||
// VOREStation Add: Preferred Language Setting;
|
||||
if(prey.prefs.preferred_language) // Do we have a preferred language?
|
||||
var/datum/language/def_lang = GLOB.all_languages[prey.prefs.preferred_language]
|
||||
if(def_lang)
|
||||
new_character.default_language = def_lang
|
||||
// VOREStation Add End
|
||||
|
||||
new_character.regenerate_icons()
|
||||
|
||||
@@ -179,4 +185,4 @@ Please do not abuse this ability.
|
||||
log_admin("[prey] (as [new_character.real_name] has spawned inside one of [pred]'s bellies.") // Log it. Avoid abuse.
|
||||
message_admins("[prey] (as [new_character.real_name] has spawned inside one of [pred]'s bellies.", 1)
|
||||
|
||||
return new_character // incase its ever needed
|
||||
return new_character // incase its ever needed
|
||||
|
||||
|
Before Width: | Height: | Size: 857 KiB After Width: | Height: | Size: 800 KiB |
|
Before Width: | Height: | Size: 792 KiB After Width: | Height: | Size: 763 KiB |
|
Before Width: | Height: | Size: 680 KiB After Width: | Height: | Size: 654 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 62 KiB |
|
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 391 KiB After Width: | Height: | Size: 387 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 177 KiB After Width: | Height: | Size: 181 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 160 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 733 B |
|
After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 49 KiB |
@@ -906,13 +906,6 @@
|
||||
outdoors = 0
|
||||
},
|
||||
/area/groundbase/level3/escapepad)
|
||||
"oF" = (
|
||||
/turf/unsimulated/wall/planetary/normal{
|
||||
desc = "It's quite impassable";
|
||||
icon_state = "rock-dark";
|
||||
name = "impassable rock"
|
||||
},
|
||||
/area/groundbase/level3/sw)
|
||||
"oI" = (
|
||||
/obj/machinery/light{
|
||||
dir = 1
|
||||
@@ -3526,7 +3519,7 @@ Bg
|
||||
Bg
|
||||
Bg
|
||||
Bg
|
||||
oF
|
||||
Bg
|
||||
zh
|
||||
hO
|
||||
"}
|
||||
@@ -14061,11 +14054,11 @@ IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
vs
|
||||
vs
|
||||
vs
|
||||
sP
|
||||
sP
|
||||
oK
|
||||
iT
|
||||
iT
|
||||
@@ -14203,11 +14196,11 @@ IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
vs
|
||||
vs
|
||||
vs
|
||||
sP
|
||||
sP
|
||||
oK
|
||||
iT
|
||||
iT
|
||||
@@ -14345,11 +14338,11 @@ IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
IS
|
||||
vs
|
||||
vs
|
||||
vs
|
||||
sP
|
||||
sP
|
||||
oK
|
||||
Px
|
||||
xs
|
||||
|
||||
@@ -337,6 +337,9 @@
|
||||
/area/groundbase/cargo/office
|
||||
name = "Cargo Office"
|
||||
lightswitch = 1
|
||||
/area/groundbase/cargo/storage
|
||||
name = "Cargo Storage"
|
||||
lightswitch = 0
|
||||
/area/groundbase/cargo/bay
|
||||
name = "Cargo Bay"
|
||||
lightswitch = 1
|
||||
|
||||
@@ -13264,7 +13264,7 @@
|
||||
frequency = 1443;
|
||||
level = 3;
|
||||
name = "Distribution and Waste Monitor";
|
||||
sensors = list("dist_main_meter" = "Surface - Distribution Loop", "scrub_main_meter" = "Surface - Scrubbers Loop", "mair_main_meter" = "Surface - Mixed Air Tank", "dist_aux_meter" = "Station - Distribution Loop", "scrub_aux_meter" = "Station - Scrubbers Loop", "mair_aux_meter" = "Station - Mixed Air Tank", "mair_mining_meter" = "Mining Outpost - Mixed Air Tank")
|
||||
sensors = list("dist_main_meter"="Surface - Distribution Loop","scrub_main_meter"="Surface - Scrubbers Loop","mair_main_meter"="Surface - Mixed Air Tank","dist_aux_meter"="Station - Distribution Loop","scrub_aux_meter"="Station - Scrubbers Loop","mair_aux_meter"="Station - Mixed Air Tank","mair_mining_meter"="Mining Outpost - Mixed Air Tank")
|
||||
},
|
||||
/turf/simulated/floor/tiled,
|
||||
/area/engineering/engineering_monitoring)
|
||||
@@ -14336,6 +14336,7 @@
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/on{
|
||||
dir = 8
|
||||
},
|
||||
/obj/item/device/multitool/station_buffered,
|
||||
/turf/simulated/floor/tiled,
|
||||
/area/ai_monitored/storage/eva)
|
||||
"bkU" = (
|
||||
@@ -14916,6 +14917,37 @@
|
||||
dir = 1;
|
||||
pixel_y = -24
|
||||
},
|
||||
/obj/structure/table/rack/shelf,
|
||||
/obj/item/device/radio/headset/explorer{
|
||||
pixel_y = -5;
|
||||
pixel_x = -5
|
||||
},
|
||||
/obj/item/device/radio/headset/explorer{
|
||||
pixel_x = -5;
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/device/radio/headset/explorer{
|
||||
pixel_y = 5
|
||||
},
|
||||
/obj/item/device/radio/headset/explorer{
|
||||
pixel_y = 5;
|
||||
pixel_x = 5
|
||||
},
|
||||
/obj/item/device/radio/headset/explorer{
|
||||
pixel_y = 5;
|
||||
pixel_x = 11
|
||||
},
|
||||
/obj/item/device/radio/headset/explorer{
|
||||
pixel_y = -5;
|
||||
pixel_x = 11
|
||||
},
|
||||
/obj/item/device/radio/headset/explorer{
|
||||
pixel_y = -5;
|
||||
pixel_x = 5
|
||||
},
|
||||
/obj/item/device/radio/headset/explorer{
|
||||
pixel_y = -5
|
||||
},
|
||||
/turf/simulated/floor/tiled,
|
||||
/area/gateway/prep_room)
|
||||
"bHV" = (
|
||||
@@ -24779,6 +24811,7 @@
|
||||
/obj/machinery/light{
|
||||
dir = 1
|
||||
},
|
||||
/obj/item/device/radio/headset/explorer,
|
||||
/turf/simulated/floor,
|
||||
/area/tether/exploration/pilot_office)
|
||||
"lfI" = (
|
||||
@@ -25819,6 +25852,7 @@
|
||||
/obj/machinery/alarm{
|
||||
pixel_y = 22
|
||||
},
|
||||
/obj/item/device/radio/headset/explorer,
|
||||
/turf/simulated/floor,
|
||||
/area/tether/exploration/pilot_office)
|
||||
"mdh" = (
|
||||
|
||||
@@ -1414,6 +1414,7 @@
|
||||
#include "code\game\objects\items\weapons\melee\energy_vr.dm"
|
||||
#include "code\game\objects\items\weapons\melee\misc.dm"
|
||||
#include "code\game\objects\items\weapons\melee\misc_vr.dm"
|
||||
#include "code\game\objects\items\weapons\melee\shock_maul.dm"
|
||||
#include "code\game\objects\items\weapons\storage\backpack.dm"
|
||||
#include "code\game\objects\items\weapons\storage\backpack_vr.dm"
|
||||
#include "code\game\objects\items\weapons\storage\bags.dm"
|
||||
|
||||