Merge branch 'master' into upstream-merge-13406
@@ -11,6 +11,7 @@
|
||||
#define DM_SIZE_STEAL "Size Steal"
|
||||
#define DM_HEAL "Heal"
|
||||
#define DM_EGG "Encase In Egg"
|
||||
#define DM_SELECT "Selective"
|
||||
|
||||
//Addon mode flags
|
||||
#define DM_FLAG_NUMBING 0x1
|
||||
|
||||
@@ -161,6 +161,10 @@
|
||||
var/obj/item/organ/external/hand = H.organs_by_name[check_hand]
|
||||
if(istype(hand) && hand.is_usable())
|
||||
return TRUE
|
||||
var/mob/living/simple_mob/S = M
|
||||
if(istype(S) && S.has_hands) //Are they a mob? And do they have hands?
|
||||
return TRUE
|
||||
|
||||
return FALSE
|
||||
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
/obj/item/device/analyzer/attack_self(mob/user as mob)
|
||||
if (user.stat)
|
||||
return
|
||||
if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey")
|
||||
if (!user.IsAdvancedToolUser())
|
||||
to_chat(usr, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
dat += "Body Temperature: ???"
|
||||
user.show_message("<span class='notice'>[dat]</span>", 1)
|
||||
return
|
||||
if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey")
|
||||
if (!user.IsAdvancedToolUser())
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
/obj/item/device/mass_spectrometer/attack_self(mob/user as mob)
|
||||
if (user.stat)
|
||||
return
|
||||
if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey")
|
||||
if (!user.IsAdvancedToolUser())
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
if(reagents.total_volume)
|
||||
|
||||
@@ -20,8 +20,7 @@
|
||||
to_chat(user, "<span class='warning'>\The [src] cannot be applied to [M]!</span>")
|
||||
return 1
|
||||
|
||||
if ( ! (istype(user, /mob/living/carbon/human) || \
|
||||
istype(user, /mob/living/silicon)) )
|
||||
if (!M.IsAdvancedToolUser())
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return 1
|
||||
|
||||
@@ -129,7 +128,7 @@
|
||||
if(used >= available)
|
||||
to_chat(user, "<span class='warning'>You run out of [src]!</span>")
|
||||
break
|
||||
|
||||
|
||||
if (W.current_stage <= W.max_bleeding_stage)
|
||||
user.visible_message("<b>\The [user]</b> bandages \a [W.desc] on [M]'s [affecting.name].", \
|
||||
"<span class='notice'>You bandage \a [W.desc] on [M]'s [affecting.name].</span>" )
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
user.setClickCooldown(user.get_attack_speed(src))
|
||||
user.do_attack_animation(M)
|
||||
|
||||
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
|
||||
if (!user.IsAdvancedToolUser())
|
||||
to_chat(user, "<span class='danger'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -84,6 +84,49 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/trash_pile/attack_ghost(mob/observer/user as mob)
|
||||
if(config.disable_player_mice)
|
||||
to_chat(user, "<span class='warning'>Spawning as a mouse is currently disabled.</span>")
|
||||
return
|
||||
|
||||
//VOREStation Add Start
|
||||
if(jobban_isbanned(user, "GhostRoles"))
|
||||
to_chat(user, "<span class='warning'>You cannot become a mouse because you are banned from playing ghost roles.</span>")
|
||||
return
|
||||
//VOREStation Add End
|
||||
|
||||
if(!user.MayRespawn(1))
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T || (T.z in using_map.admin_levels))
|
||||
to_chat(user, "<span class='warning'>You may not spawn as a mouse on this Z-level.</span>")
|
||||
return
|
||||
|
||||
var/timedifference = world.time - user.client.time_died_as_mouse
|
||||
if(user.client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600)
|
||||
var/timedifference_text
|
||||
timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss")
|
||||
to_chat(user, "<span class='warning'>You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.</span>")
|
||||
return
|
||||
|
||||
var/response = tgui_alert(user, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("Squeek!","Nope!"))
|
||||
if(response != "Squeek!") return //Hit the wrong key...again.
|
||||
|
||||
var/mob/living/simple_mob/animal/passive/mouse/host
|
||||
host = new /mob/living/simple_mob/animal/passive/mouse(get_turf(src))
|
||||
|
||||
if(host)
|
||||
if(config.uneducated_mice)
|
||||
host.universal_understand = 0
|
||||
announce_ghost_joinleave(src, 0, "They are now a mouse.")
|
||||
host.ckey = user.ckey
|
||||
to_chat(host, "<span class='info'>You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.</span>")
|
||||
|
||||
var/atom/A = get_holder_at_turf_level(src)
|
||||
A.visible_message("[host] crawls out of \the [src].")
|
||||
return
|
||||
|
||||
/obj/structure/trash_pile/attack_hand(mob/user)
|
||||
//Human mob
|
||||
if(ishuman(user))
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
|
||||
req_access = list()
|
||||
req_one_access = list()
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage) //CHOMP Edit
|
||||
offline_vision_restriction = 1
|
||||
|
||||
initial_modules = list(
|
||||
|
||||
@@ -513,14 +513,17 @@
|
||||
|ACCESSORY_SLOT_ARMOR_A\
|
||||
|ACCESSORY_SLOT_ARMOR_L\
|
||||
|ACCESSORY_SLOT_ARMOR_S\
|
||||
|ACCESSORY_SLOT_ARMOR_M)
|
||||
|ACCESSORY_SLOT_ARMOR_M\
|
||||
|ACCESSORY_SLOT_OVER\
|
||||
|ACCESSORY_SLOT_ARMBAND) //CHOMPEdit - let pcarriers have fashion
|
||||
restricted_accessory_slots = (\
|
||||
ACCESSORY_SLOT_INSIGNIA\
|
||||
|ACCESSORY_SLOT_ARMOR_C\
|
||||
|ACCESSORY_SLOT_ARMOR_A\
|
||||
|ACCESSORY_SLOT_ARMOR_L\
|
||||
|ACCESSORY_SLOT_ARMOR_S\
|
||||
|ACCESSORY_SLOT_ARMOR_M)
|
||||
|ACCESSORY_SLOT_ARMOR_M\
|
||||
|ACCESSORY_SLOT_ARMBAND) //CHOMPEdit - let pcarriers have fashion
|
||||
blood_overlay_type = "armor"
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = FALSE)
|
||||
@@ -639,4 +642,4 @@
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/bulletproof, /obj/item/clothing/accessory/armor/armguards/bulletproof, /obj/item/clothing/accessory/armor/legguards/bulletproof, /obj/item/clothing/accessory/storage/pouches)
|
||||
|
||||
/obj/item/clothing/suit/armor/pcarrier/riot/full
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/riot, /obj/item/clothing/accessory/armor/armguards/riot, /obj/item/clothing/accessory/armor/legguards/riot, /obj/item/clothing/accessory/storage/pouches)
|
||||
starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/riot, /obj/item/clothing/accessory/armor/armguards/riot, /obj/item/clothing/accessory/armor/legguards/riot, /obj/item/clothing/accessory/storage/pouches)
|
||||
|
||||
@@ -361,7 +361,7 @@ var/list/mining_overlay_cache = list()
|
||||
//Not even going to touch this pile of spaghetti
|
||||
/turf/simulated/mineral/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
|
||||
if (!user.IsAdvancedToolUser())
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -354,7 +354,7 @@
|
||||
|
||||
R.icon = 'icons/mob/widerobot_vr.dmi'
|
||||
|
||||
src.modules += new /obj/item/device/dogborg/pounce_module(src) //Pounce shit test
|
||||
src.modules += new /obj/item/weapon/dogborg/pounce(src) //CHOMPEdit - Switch to the more balanced pounce module
|
||||
R.icon = 'icons/mob/widerobot_med_vr.dmi'
|
||||
R.wideborg_dept = 'icons/mob/widerobot_med_vr.dmi'
|
||||
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
|
||||
@@ -390,7 +390,7 @@
|
||||
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg/ertgun(src)
|
||||
src.modules += new /obj/item/weapon/dogborg/swordtail(src)
|
||||
src.modules += new /obj/item/weapon/tool/crowbar(src)
|
||||
src.modules += new /obj/item/device/dogborg/pounce_module(src) //Pounce shit test
|
||||
src.modules += new /obj/item/weapon/dogborg/pounce(src) //CHOMPEdit - Switch to the more balanced pounce module
|
||||
src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src)
|
||||
|
||||
var/datum/matter_synth/water = new /datum/matter_synth(500)
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
src.modules += new /obj/item/device/dogborg/boop_module(src) //Boop people on the nose.
|
||||
src.modules += new /obj/item/device/dogborg/tongue(src) //This is so they can clean up bloody evidence after it's examined, and so they can lick crew.
|
||||
src.modules += new /obj/item/device/dogborg/sleeper/K9(src) //Eat criminals. Bring them to the brig.
|
||||
src.modules += new /obj/item/device/dogborg/pounce_module(src) //Pounce shit test
|
||||
src.modules += new /obj/item/weapon/dogborg/pounce(src) //CHOMPEdit - Switch to the more balanced pounce module
|
||||
src.modules += new /obj/item/borg/sight/material(src)
|
||||
src.modules += new /obj/item/weapon/tool/wrench(src)
|
||||
src.modules += new /obj/item/weapon/tool/screwdriver(src)
|
||||
@@ -98,7 +98,7 @@
|
||||
src.emag.reagents.add_reagent("pacid", 250)
|
||||
src.emag.name = "Polyacid spray"
|
||||
|
||||
src.modules += new /obj/item/device/dogborg/pounce_module(src) //Pounce shit test
|
||||
src.modules += new /obj/item/weapon/dogborg/pounce(src) //CHOMPEdit - Switch to the more balanced pounce module.
|
||||
//R.icon_state = "medihound"
|
||||
R.pixel_x = -16
|
||||
R.old_x = -16
|
||||
|
||||
@@ -47,4 +47,12 @@
|
||||
add_modifier(/datum/modifier/berserk, 30 SECONDS)
|
||||
|
||||
/decl/mob_organ_names/goose
|
||||
hit_zones = list("head", "chest", "left leg", "right leg", "left wing", "right wing", "neck")
|
||||
hit_zones = list("head", "chest", "left leg", "right leg", "left wing", "right wing", "neck")
|
||||
|
||||
/mob/living/simple_mob/animal/space/goose/white
|
||||
icon = 'icons/mob/animal_vr.dmi'
|
||||
icon_state = "whitegoose"
|
||||
icon_living = "whitegoose"
|
||||
icon_dead = "whitegoose_dead"
|
||||
name = "white goose"
|
||||
desc = "And just when you thought it was a lovely day..."
|
||||
@@ -11,8 +11,6 @@
|
||||
verbs |= /mob/living/simple_mob/proc/set_name
|
||||
verbs |= /mob/living/simple_mob/proc/set_desc
|
||||
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
ooc_notes = client.prefs.metadata
|
||||
digestable = client.prefs_vr.digestable
|
||||
devourable = client.prefs_vr.devourable
|
||||
@@ -20,7 +18,7 @@
|
||||
feeding = client.prefs_vr.feeding
|
||||
can_be_drop_prey = client.prefs_vr.can_be_drop_prey
|
||||
can_be_drop_pred = client.prefs_vr.can_be_drop_pred
|
||||
allow_inbelly_spawning = client.prefs_vr.allow_inbelly_spawning
|
||||
latejoin_vore = client.prefs_vr.latejoin_vore //CHOMPedit
|
||||
allow_spontaneous_tf = client.prefs_vr.allow_spontaneous_tf
|
||||
digest_leave_remains = client.prefs_vr.digest_leave_remains
|
||||
allowmobvore = client.prefs_vr.allowmobvore
|
||||
@@ -38,7 +36,6 @@
|
||||
pickup_pref = client.prefs_vr.pickup_pref
|
||||
|
||||
|
||||
>>>>>>> 7550df1e26... Merge pull request #13406 from Heroman3003/selective-upgrade
|
||||
/mob/living/simple_mob/proc/set_name()
|
||||
set name = "Set Name"
|
||||
set desc = "Sets your mobs name. You only get to do this once."
|
||||
|
||||
@@ -433,3 +433,52 @@
|
||||
icon_state = "teshlarge_eyes_het"
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
body_parts = list(BP_HEAD)
|
||||
|
||||
// Nightstalker Body Markings
|
||||
/datum/sprite_accessory/marking/ch/desert_nightstalker
|
||||
name = "Nightstalker Scales (Desert Coloration)"
|
||||
icon_state = "nightstalker_desert"
|
||||
body_parts = list(BP_R_ARM,BP_L_ARM,BP_R_HAND,BP_L_HAND,BP_R_LEG,BP_L_LEG,BP_R_FOOT,BP_L_FOOT,BP_TORSO,BP_GROIN) // Fullbody markings, save head
|
||||
do_colouration = 0 // Don't color, these are pre-colored markings
|
||||
|
||||
/datum/sprite_accessory/marking/ch/desert_nightstalker_head
|
||||
name = "Nightstalker Head (Desert Coloration)"
|
||||
icon_state = "nightstalker_desert"
|
||||
body_parts = list(BP_HEAD)
|
||||
do_colouration = 0 // Don't color, these are pre-colored markings
|
||||
|
||||
/datum/sprite_accessory/marking/ch/nightstalker_head_center
|
||||
name = "Nightstalker Head, Tricolor (Center)"
|
||||
icon_state = "nightstalker_1"
|
||||
body_parts = list(BP_HEAD)
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/marking/ch/nightstalker_head_left
|
||||
name = "Nightstalker Head, Tricolor (Left)"
|
||||
icon_state = "nightstalker_2"
|
||||
body_parts = list(BP_HEAD)
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/marking/ch/nightstalker_head_right
|
||||
name = "Nightstalker Head, Tricolor (Right)"
|
||||
icon_state = "nightstalker_3"
|
||||
body_parts = list(BP_HEAD)
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/marking/ch/diamondback_nightstalker_outer
|
||||
name = "Nightstalker Scales, Outer"
|
||||
icon_state = "nightstalker_1"
|
||||
body_parts = list(BP_R_ARM,BP_L_ARM,BP_R_HAND,BP_L_HAND,BP_R_LEG,BP_L_LEG,BP_R_FOOT,BP_L_FOOT,BP_TORSO,BP_GROIN) // Fullbody markings, save head
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/marking/ch/diamondback_nightstalker_inner
|
||||
name = "Nightstalker Scales, Inner"
|
||||
icon_state = "nightstalker_2"
|
||||
body_parts = list(BP_R_ARM,BP_L_ARM,BP_R_LEG,BP_L_LEG,BP_TORSO,BP_GROIN) // Fullbody markings, save head
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/marking/ch/outer_spots
|
||||
name = "Spots, Outer"
|
||||
icon_state = "spots_extremities"
|
||||
body_parts = list(BP_R_ARM,BP_L_ARM,BP_R_LEG,BP_L_LEG,BP_R_FOOT,BP_L_FOOT)
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
@@ -141,4 +141,20 @@
|
||||
icon_state = "bigringtail"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "bigringtail_markings"
|
||||
extra_overlay = "bigringtail_markings"
|
||||
|
||||
/datum/sprite_accessory/tail/longtail/desert_nightstalker
|
||||
name = "Desert Nightstalker Tail (vwag)"
|
||||
icon = 'icons/mob/vore/taurs_ch.dmi'
|
||||
icon_state = "nightstalker_desert"
|
||||
ani_state = "nightstalker_desert_w"
|
||||
do_colouration = 0 // We're not coloring this, these are pre-colored
|
||||
color_blend_mode = ICON_ADD
|
||||
|
||||
/datum/sprite_accessory/tail/longtail/diamondback_nightstalker
|
||||
name = "Diamondback Nightstalker Tail (dual-color, vwag)"
|
||||
icon = 'icons/mob/vore/taurs_ch.dmi'
|
||||
icon_state = "nightstalker_diamondback"
|
||||
ani_state = "nightstalker_diamondback_w"
|
||||
extra_overlay = "nightstalker_diamondback_markings"
|
||||
extra_overlay_w = "nightstalker_diamondback_markings_w"
|
||||
@@ -242,12 +242,11 @@ GLOBAL_LIST_INIT(digest_modes, list())
|
||||
B.ownegg = null
|
||||
return list("to_update" = TRUE)
|
||||
return
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
|
||||
/datum/digest_mode/selective //unselectable, "smart" digestion mode for mobs only
|
||||
id = DM_SELECT
|
||||
|
||||
|
||||
/datum/digest_mode/selective/process_mob(obj/belly/B, mob/living/L)
|
||||
var/datum/digest_mode/tempmode = GLOB.digest_modes[DM_HOLD] // Default to Hold in case of big oof fallback
|
||||
//if not absorbed, see if they're food
|
||||
@@ -280,5 +279,4 @@ GLOBAL_LIST_INIT(digest_modes, list())
|
||||
tempmode = GLOB.digest_modes[DM_DIGEST] // If not absorbable, are they digestible? Then digest.
|
||||
else
|
||||
tempmode = GLOB.digest_modes[DM_DRAIN] // Otherwise drain.
|
||||
return tempmode.process_mob(B, L)
|
||||
>>>>>>> 7550df1e26... Merge pull request #13406 from Heroman3003/selective-upgrade
|
||||
return tempmode.process_mob(B, L)
|
||||
@@ -139,7 +139,7 @@
|
||||
|
||||
if(emote_active)
|
||||
var/list/EL = emote_lists[digest_mode]
|
||||
if((LAZYLEN(EL) || LAZYLEN(emote_lists[DM_HOLD_ABSORBED]) || (digest_mode == DM_DIGEST && LAZYLEN(emote_lists[DM_HOLD]))) && next_emote <= world.time)
|
||||
if((LAZYLEN(EL) || LAZYLEN(emote_lists[DM_HOLD_ABSORBED]) || (digest_mode == DM_DIGEST && LAZYLEN(emote_lists[DM_HOLD])) || (digest_mode == DM_SELECT && (LAZYLEN(emote_lists[DM_HOLD])||LAZYLEN(emote_lists[DM_DIGEST])||LAZYLEN(emote_lists[DM_ABSORB])) )) && next_emote <= world.time)
|
||||
var/living_count = 0
|
||||
var/absorbed_count = 0
|
||||
for(var/mob/living/L in contents)
|
||||
@@ -160,7 +160,14 @@
|
||||
if(formatted_message)
|
||||
to_chat(M, "<span class='notice'>[formatted_message]</span>")
|
||||
else
|
||||
if(digest_mode == DM_DIGEST && !M.digestable)
|
||||
if (digest_mode == DM_SELECT)
|
||||
if (M.digestable)
|
||||
EL = emote_lists[DM_DIGEST]
|
||||
else if (M.absorbable)
|
||||
EL = emote_lists[DM_ABSORB]
|
||||
else
|
||||
EL = emote_lists[DM_HOLD]
|
||||
else if(digest_mode == DM_DIGEST && !M.digestable)
|
||||
EL = emote_lists[DM_HOLD] // Use Hold's emote list if we're indigestible
|
||||
|
||||
var/raw_message = pick(EL)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/machinery/artifact/predefined/hungry_statue
|
||||
name = "alien artifact"
|
||||
desc = "A large alien device."
|
||||
icon = 'icons/obj/xenoarchaeology.dmi' //CHOMP Fix
|
||||
|
||||
artifact_master = /datum/component/artifact_master/hungry_statue
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
@@ -13,6 +13,7 @@ const digestModeToColor = {
|
||||
'Absorb': 'purple',
|
||||
'Unabsorb': 'purple',
|
||||
'Drain': 'orange',
|
||||
'Selective': 'orange',
|
||||
'Shrink': 'teal',
|
||||
'Grow': 'teal',
|
||||
'Size Steal': 'teal',
|
||||
@@ -26,6 +27,7 @@ const digestModeToPreyMode = {
|
||||
'Absorb': 'being absorbed.',
|
||||
'Unabsorb': 'being unabsorbed.',
|
||||
'Drain': 'being drained.',
|
||||
'Selective': 'being processed.',
|
||||
'Shrink': 'being shrunken.',
|
||||
'Grow': 'being grown.',
|
||||
'Size Steal': 'having your size stolen.',
|
||||
|
||||