mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-23 03:57:48 +01:00
Merge branch 'dev-freeze' of github.com:Baystation12/Baystation12 into dev
This commit is contained in:
@@ -858,6 +858,7 @@
|
||||
#include "code\modules\mob\death.dm"
|
||||
#include "code\modules\mob\emote.dm"
|
||||
#include "code\modules\mob\hear_say.dm"
|
||||
#include "code\modules\mob\holder.dm"
|
||||
#include "code\modules\mob\inventory.dm"
|
||||
#include "code\modules\mob\language.dm"
|
||||
#include "code\modules\mob\login.dm"
|
||||
|
||||
@@ -721,13 +721,14 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
|
||||
|
||||
var/delayfraction = round(delay/numticks)
|
||||
var/original_loc = user.loc
|
||||
var/original_turf = get_turf(user)
|
||||
var/holding = user.get_active_hand()
|
||||
|
||||
for(var/i = 0, i<numticks, i++)
|
||||
sleep(delayfraction)
|
||||
|
||||
|
||||
if(!user || user.stat || user.weakened || user.stunned || (user.loc != original_loc))
|
||||
if(!user || user.stat || user.weakened || user.stunned || user.loc != original_loc || get_turf(user) != original_turf)
|
||||
return 0
|
||||
if(needhand && !(user.get_active_hand() == holding)) //Sometimes you don't want the user to have to keep their active hand
|
||||
return 0
|
||||
|
||||
@@ -71,8 +71,8 @@
|
||||
|
||||
/mob/Move(n,direct)
|
||||
var/oldLoc = src.loc
|
||||
. = ..()
|
||||
if(.)
|
||||
//. = ..()
|
||||
if(..(n,direct))
|
||||
if(src.visibilityNetworks.len)
|
||||
if(!src.updatingVisibilityNetworks)
|
||||
src.updatingVisibilityNetworks = 1
|
||||
@@ -81,7 +81,7 @@
|
||||
for (var/datum/visibility_network/currentNetwork in src.visibilityNetworks)
|
||||
currentNetwork.updateMob(src)
|
||||
src.updatingVisibilityNetworks = 0
|
||||
return ..(n,direct)
|
||||
return .
|
||||
|
||||
/mob/proc/addToVisibilityNetwork(var/datum/visibility_network/network)
|
||||
if(network)
|
||||
|
||||
@@ -179,7 +179,6 @@
|
||||
del(T)
|
||||
Z << "<B>You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike.</B>"
|
||||
Z << "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>"
|
||||
Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall(Z)
|
||||
Z.cancel_camera()
|
||||
del(C)
|
||||
|
||||
@@ -195,7 +194,6 @@
|
||||
del(T)
|
||||
Z << "<B>You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.</B>"
|
||||
Z << "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>"
|
||||
Z.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift(Z)
|
||||
Z.cancel_camera()
|
||||
del(C)
|
||||
|
||||
@@ -211,10 +209,6 @@
|
||||
del(T)
|
||||
Z << "<B>You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs</B>"
|
||||
Z << "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>"
|
||||
Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser(Z)
|
||||
Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/wall(Z)
|
||||
Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/floor(Z)
|
||||
Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone(Z)
|
||||
Z.cancel_camera()
|
||||
del(C)
|
||||
else
|
||||
|
||||
@@ -78,13 +78,13 @@ var/const/HOLOPAD_MODE = 0
|
||||
|
||||
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
|
||||
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
|
||||
/obj/machinery/hologram/holopad/hear_talk(mob/living/M, text)
|
||||
/obj/machinery/hologram/holopad/hear_talk(mob/living/M, text, verb)
|
||||
if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something.
|
||||
if(!master.say_understands(M))//The AI will be able to understand most mobs talking through the holopad.
|
||||
text = stars(text)
|
||||
var/name_used = M.GetVoice()
|
||||
//This communication is imperfect because the holopad "filters" voices and is only designed to connect to the master only.
|
||||
var/rendered = "<i><span class='game say'>Holopad received, <span class='name'>[name_used]</span> <span class='message'>[M.say_quote(text)]</span></span></i>"
|
||||
var/rendered = "<i><span class='game say'>Holopad received, <span class='name'>[name_used]</span> [verb], <span class='message'>\"[text]\"</span></span></i>"
|
||||
master.show_message(rendered, 2)
|
||||
return
|
||||
|
||||
@@ -210,4 +210,4 @@ Holographic project of everything else.
|
||||
name = "hologram projector"
|
||||
desc = "It makes a hologram appear...with magnets or something..."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "hologram0"
|
||||
icon_state = "hologram0"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
desc = "A folded bag designed for the storage and transportation of cadavers."
|
||||
icon = 'icons/obj/bodybag.dmi'
|
||||
icon_state = "bodybag_folded"
|
||||
w_class = 2.0
|
||||
|
||||
attack_self(mob/user)
|
||||
var/obj/structure/closet/body_bag/R = new /obj/structure/closet/body_bag(user.loc)
|
||||
|
||||
@@ -464,7 +464,7 @@
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
storage_slots=21
|
||||
can_hold = list("/obj/item/weapon/light/tube", "/obj/item/weapon/light/bulb")
|
||||
max_combined_w_class = 21
|
||||
max_combined_w_class = 42 //holds 21 items of w_class 2
|
||||
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
|
||||
|
||||
/obj/item/weapon/storage/box/lights/bulbs/New()
|
||||
|
||||
@@ -561,7 +561,7 @@ datum/preferences
|
||||
return
|
||||
|
||||
proc/SetAntagoptions(mob/user)
|
||||
if(uplinklocation == "")
|
||||
if(uplinklocation == "" || !uplinklocation)
|
||||
uplinklocation = "PDA"
|
||||
var/HTML = "<body>"
|
||||
HTML += "<tt><center>"
|
||||
|
||||
@@ -39,12 +39,30 @@
|
||||
// Type 1 (Visual) emotes are sent to anyone in view of the item
|
||||
if (m_type & 1)
|
||||
for (var/mob/O in viewers(src, null))
|
||||
|
||||
if(O.status_flags & PASSEMOTES)
|
||||
|
||||
for(var/obj/item/weapon/holder/H in O.contents)
|
||||
H.show_message(message, m_type)
|
||||
|
||||
for(var/mob/living/M in O.contents)
|
||||
M.show_message(message, m_type)
|
||||
|
||||
O.show_message(message, m_type)
|
||||
|
||||
// Type 2 (Audible) emotes are sent to anyone in hear range
|
||||
// of the *LOCATION* -- this is important for pAIs to be heard
|
||||
else if (m_type & 2)
|
||||
for (var/mob/O in hearers(get_turf(src), null))
|
||||
|
||||
if(O.status_flags & PASSEMOTES)
|
||||
|
||||
for(var/obj/item/weapon/holder/H in O.contents)
|
||||
H.show_message(message, m_type)
|
||||
|
||||
for(var/mob/living/M in O.contents)
|
||||
M.show_message(message, m_type)
|
||||
|
||||
O.show_message(message, m_type)
|
||||
|
||||
/mob/proc/emote_dead(var/message)
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
//Helper object for picking dionaea (and other creatures) up.
|
||||
/obj/item/weapon/holder
|
||||
name = "holder"
|
||||
desc = "You shouldn't ever see this."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
slot_flags = SLOT_HEAD
|
||||
|
||||
/obj/item/weapon/holder/New()
|
||||
..()
|
||||
processing_objects.Add(src)
|
||||
|
||||
/obj/item/weapon/holder/Del()
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/holder/process()
|
||||
|
||||
if(istype(loc,/turf) || !(contents.len))
|
||||
|
||||
for(var/mob/M in contents)
|
||||
|
||||
var/atom/movable/mob_container
|
||||
mob_container = M
|
||||
mob_container.forceMove(get_turf(src))
|
||||
M.reset_view()
|
||||
|
||||
del(src)
|
||||
|
||||
/obj/item/weapon/holder/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
for(var/mob/M in src.contents)
|
||||
M.attackby(W,user)
|
||||
|
||||
/obj/item/weapon/holder/proc/show_message(var/message, var/m_type)
|
||||
for(var/mob/living/M in contents)
|
||||
M.show_message(message,m_type)
|
||||
|
||||
//Mob specific holders.
|
||||
|
||||
/obj/item/weapon/holder/diona
|
||||
|
||||
name = "diona nymph"
|
||||
desc = "It's a tiny plant critter."
|
||||
icon_state = "nymph"
|
||||
origin_tech = "magnets=3;biotech=5"
|
||||
|
||||
/obj/item/weapon/holder/drone
|
||||
|
||||
name = "maintenance drone"
|
||||
desc = "It's a small maintenance robot."
|
||||
icon_state = "drone"
|
||||
origin_tech = "magnets=3;engineering=5"
|
||||
@@ -29,7 +29,7 @@
|
||||
var/b_type = "A+" //Player's bloodtype
|
||||
|
||||
var/underwear = 1 //Which underwear the player wants
|
||||
var/undershirt = 1 //Which undershirt the player wants.
|
||||
var/undershirt = 0 //Which undershirt the player wants.
|
||||
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
|
||||
|
||||
//Equipment slots
|
||||
|
||||
@@ -2,45 +2,6 @@
|
||||
Tiny babby plant critter plus procs.
|
||||
*/
|
||||
|
||||
//Helper object for picking dionaea (and other creatures) up.
|
||||
/obj/item/weapon/holder
|
||||
name = "holder"
|
||||
desc = "You shouldn't ever see this."
|
||||
|
||||
/obj/item/weapon/holder/diona
|
||||
|
||||
name = "diona nymph"
|
||||
desc = "It's a tiny plant critter."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "nymph"
|
||||
slot_flags = SLOT_HEAD
|
||||
origin_tech = "magnets=3;biotech=5"
|
||||
|
||||
/obj/item/weapon/holder/New()
|
||||
..()
|
||||
processing_objects.Add(src)
|
||||
|
||||
/obj/item/weapon/holder/Del()
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/holder/process()
|
||||
|
||||
if(istype(loc,/turf) || !(contents.len))
|
||||
|
||||
for(var/mob/M in contents)
|
||||
|
||||
var/atom/movable/mob_container
|
||||
mob_container = M
|
||||
mob_container.forceMove(get_turf(src))
|
||||
M.reset_view()
|
||||
|
||||
del(src)
|
||||
|
||||
/obj/item/weapon/holder/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
for(var/mob/M in src.contents)
|
||||
M.attackby(W,user)
|
||||
|
||||
//Mob defines.
|
||||
/mob/living/carbon/monkey/diona
|
||||
name = "diona nymph"
|
||||
@@ -67,6 +28,7 @@
|
||||
D.attack_hand(M)
|
||||
M << "You scoop up [src]."
|
||||
src << "[M] scoops you up."
|
||||
M.status_flags |= PASSEMOTES
|
||||
return
|
||||
|
||||
..()
|
||||
@@ -108,6 +70,8 @@
|
||||
|
||||
if(istype(M,/mob/living/carbon/human))
|
||||
M << "You feel your being twine with that of [src] as it merges with your biomass."
|
||||
M.status_flags |= PASSEMOTES
|
||||
|
||||
src << "You feel your being twine with that of [M] as you merge with its biomass."
|
||||
src.loc = M
|
||||
src.verbs += /mob/living/carbon/monkey/diona/proc/split
|
||||
@@ -127,10 +91,19 @@
|
||||
|
||||
src.loc << "You feel a pang of loss as [src] splits away from your biomass."
|
||||
src << "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground."
|
||||
|
||||
var/mob/living/M = src.loc
|
||||
|
||||
src.loc = get_turf(src)
|
||||
src.verbs -= /mob/living/carbon/monkey/diona/proc/split
|
||||
src.verbs += /mob/living/carbon/monkey/diona/proc/merge
|
||||
|
||||
if(istype(M))
|
||||
for(var/atom/A in M.contents)
|
||||
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
|
||||
return
|
||||
M.status_flags &= ~PASSEMOTES
|
||||
|
||||
/mob/living/carbon/monkey/diona/verb/fertilize_plant()
|
||||
|
||||
set category = "Diona"
|
||||
@@ -269,16 +242,16 @@
|
||||
if(client.prefs.muted & MUTE_IC)
|
||||
src << "\red You cannot speak in IC (Muted)."
|
||||
return
|
||||
|
||||
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
|
||||
|
||||
|
||||
if(stat == 2)
|
||||
return say_dead(message)
|
||||
|
||||
var/datum/language/speaking = null
|
||||
|
||||
|
||||
|
||||
|
||||
if(length(message) >= 2)
|
||||
var/channel_prefix = copytext(message, 1 ,3)
|
||||
@@ -292,7 +265,7 @@
|
||||
if(speaking)
|
||||
message = trim(copytext(message,3))
|
||||
|
||||
message = capitalize(trim_left(message))
|
||||
message = capitalize(trim_left(message))
|
||||
|
||||
if(!message || stat)
|
||||
return
|
||||
|
||||
@@ -218,14 +218,14 @@
|
||||
"gloves" = 'icons/mob/species/vox/gloves.dmi'
|
||||
)
|
||||
|
||||
/datum/species/vox/handle_post_spawn()
|
||||
/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H)
|
||||
|
||||
verbs += /mob/living/carbon/human/proc/leap
|
||||
H.verbs += /mob/living/carbon/human/proc/leap
|
||||
..()
|
||||
|
||||
/datum/species/vox/armalis/handle_post_spawn()
|
||||
/datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H)
|
||||
|
||||
verbs += /mob/living/carbon/human/proc/gut
|
||||
H.verbs += /mob/living/carbon/human/proc/gut
|
||||
..()
|
||||
|
||||
/datum/species/vox/armalis
|
||||
|
||||
@@ -460,6 +460,13 @@
|
||||
else if(istype(H.loc,/obj/item))
|
||||
src << "You struggle free of [H.loc]."
|
||||
H.loc = get_turf(H)
|
||||
|
||||
if(istype(M))
|
||||
for(var/atom/A in M.contents)
|
||||
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
|
||||
return
|
||||
|
||||
M.status_flags &= ~PASSEMOTES
|
||||
return
|
||||
|
||||
//Resisting control by an alien mind.
|
||||
|
||||
@@ -33,18 +33,6 @@
|
||||
layer = MOB_LAYER
|
||||
src << text("\blue You have stopped hiding.")
|
||||
|
||||
//DRONE PICKUP.
|
||||
//Item holder.
|
||||
/obj/item/weapon/holder/drone
|
||||
|
||||
name = "maintenance drone"
|
||||
desc = "It's a small maintenance robot."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "drone"
|
||||
slot_flags = SLOT_HEAD
|
||||
origin_tech = "magnets=3;engineering=5"
|
||||
|
||||
|
||||
//Actual picking-up event.
|
||||
/mob/living/silicon/robot/drone/attack_hand(mob/living/carbon/human/M as mob)
|
||||
|
||||
@@ -54,6 +42,7 @@
|
||||
D.attack_hand(M)
|
||||
M << "You scoop up [src]."
|
||||
src << "[M] scoops you up."
|
||||
M.status_flags |= PASSEMOTES
|
||||
return
|
||||
|
||||
..()
|
||||
@@ -58,7 +58,6 @@
|
||||
|
||||
..()
|
||||
|
||||
|
||||
if(host)
|
||||
|
||||
if(!stat && !host.stat)
|
||||
@@ -338,8 +337,14 @@ mob/living/simple_animal/borer/proc/detatch()
|
||||
host_brain.name = "host brain"
|
||||
host_brain.real_name = "host brain"
|
||||
|
||||
var/mob/living/H = host
|
||||
host = null
|
||||
|
||||
for(var/atom/A in H.contents)
|
||||
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
|
||||
return
|
||||
H.status_flags &= ~PASSEMOTES
|
||||
|
||||
/mob/living/simple_animal/borer/verb/infest()
|
||||
set category = "Alien"
|
||||
set name = "Infest"
|
||||
@@ -406,6 +411,7 @@ mob/living/simple_animal/borer/proc/detatch()
|
||||
|
||||
host_brain.name = M.name
|
||||
host_brain.real_name = M.real_name
|
||||
host.status_flags |= PASSEMOTES
|
||||
|
||||
return
|
||||
else
|
||||
|
||||
@@ -453,6 +453,7 @@ var/list/global_mutations = list() // list of hidden mutation things
|
||||
#define CANPARALYSE 4
|
||||
#define CANPUSH 8
|
||||
#define LEAPING 16
|
||||
#define PASSEMOTES 32 //Mob has a cortical borer or holders inside of it that need to see emotes.
|
||||
#define GODMODE 4096
|
||||
#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath
|
||||
#define DISFIGURED 16384 //I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system
|
||||
|
||||
+207
-207
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user