mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-12 16:37:19 +01:00
Fix indentations (#17481)
* cbt * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA * fsadffsda sad * sadfasd * jhn * dsfa * saf * safsad * sda
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
var/obj/machinery/camera/c = source
|
||||
if(!c.can_use())
|
||||
continue
|
||||
|
||||
|
||||
for(var/turf/t in c.can_see())
|
||||
visible[t] = t
|
||||
else if(isAI(source))
|
||||
@@ -21,4 +21,4 @@
|
||||
visible[t] = t
|
||||
else
|
||||
log_visualnet("Contained an unhandled source", source)
|
||||
sources -= source
|
||||
sources -= source
|
||||
|
||||
@@ -176,7 +176,7 @@
|
||||
var/mob/abstract/eye/m = eye
|
||||
if (m && m.owner && m.owner.client)
|
||||
m.owner.client.images += obfuscation_image
|
||||
|
||||
|
||||
dirty = FALSE
|
||||
updating = FALSE
|
||||
|
||||
|
||||
@@ -1,51 +1,51 @@
|
||||
// CREDITS
|
||||
/*
|
||||
Initial code credit for this goes to Uristqwerty.
|
||||
Debugging, functionality, all comments and porting by Giacom.
|
||||
Initial code credit for this goes to Uristqwerty.
|
||||
Debugging, functionality, all comments and porting by Giacom.
|
||||
|
||||
Everything about freelook (or what we can put in here) will be stored here.
|
||||
Everything about freelook (or what we can put in here) will be stored here.
|
||||
|
||||
|
||||
WHAT IS THIS?
|
||||
WHAT IS THIS?
|
||||
|
||||
This is a replacement for the current camera movement system, of the AI. Before this, the AI had to move between cameras and could
|
||||
only see what the cameras could see. Not only this but the cameras could see through walls, which created problems.
|
||||
With this, the AI controls an "AI Eye" mob, which moves just like a ghost; such as moving through walls and being invisible to players.
|
||||
The AI's eye is set to this mob and then we use a system (explained below) to determine what the cameras around the AI Eye can and
|
||||
cannot see. If the camera cannot see a turf, it will black it out, otherwise it won't and the AI will be able to see it.
|
||||
This creates several features, such as.. no more see-through-wall cameras, easier to control camera movement, easier tracking,
|
||||
the AI only being able to track mobs which are visible to a camera, only trackable mobs appearing on the mob list and many more.
|
||||
This is a replacement for the current camera movement system, of the AI. Before this, the AI had to move between cameras and could
|
||||
only see what the cameras could see. Not only this but the cameras could see through walls, which created problems.
|
||||
With this, the AI controls an "AI Eye" mob, which moves just like a ghost; such as moving through walls and being invisible to players.
|
||||
The AI's eye is set to this mob and then we use a system (explained below) to determine what the cameras around the AI Eye can and
|
||||
cannot see. If the camera cannot see a turf, it will black it out, otherwise it won't and the AI will be able to see it.
|
||||
This creates several features, such as.. no more see-through-wall cameras, easier to control camera movement, easier tracking,
|
||||
the AI only being able to track mobs which are visible to a camera, only trackable mobs appearing on the mob list and many more.
|
||||
|
||||
|
||||
HOW IT WORKS
|
||||
HOW IT WORKS
|
||||
|
||||
It works by first creating a camera network datum. Inside of this camera network are "chunks" (which will be
|
||||
explained later) and "cameras". The cameras list is kept up to date by obj/machinery/camera/New() and Destroy().
|
||||
It works by first creating a camera network datum. Inside of this camera network are "chunks" (which will be
|
||||
explained later) and "cameras". The cameras list is kept up to date by obj/machinery/camera/New() and Destroy().
|
||||
|
||||
Next the camera network has chunks. These chunks are a 16x16 tile block of turfs and cameras contained inside the chunk.
|
||||
These turfs are then sorted out based on what the cameras can and cannot see. If none of the cameras can see the turf, inside
|
||||
the 16x16 block, it is listed as an "obscured" turf. Meaning the AI won't be able to see it.
|
||||
Next the camera network has chunks. These chunks are a 16x16 tile block of turfs and cameras contained inside the chunk.
|
||||
These turfs are then sorted out based on what the cameras can and cannot see. If none of the cameras can see the turf, inside
|
||||
the 16x16 block, it is listed as an "obscured" turf. Meaning the AI won't be able to see it.
|
||||
|
||||
|
||||
HOW IT UPDATES
|
||||
HOW IT UPDATES
|
||||
|
||||
The camera network uses a streaming method in order to effeciently update chunks. Since the server will have doors opening, doors closing,
|
||||
turf being destroyed and other lag inducing stuff, we want to update it under certain conditions and not every tick.
|
||||
The camera network uses a streaming method in order to effeciently update chunks. Since the server will have doors opening, doors closing,
|
||||
turf being destroyed and other lag inducing stuff, we want to update it under certain conditions and not every tick.
|
||||
|
||||
The chunks are not created straight away, only when an AI eye moves into it's area is when it gets created.
|
||||
One a chunk is created, when a non glass door opens/closes or an opacity turf is destroyed, we check to see if an AI Eye is looking in the area.
|
||||
We do this with the "seenby" list, which updates everytime an AI is near a chunk. If there is an AI eye inside the area, we update the chunk
|
||||
that the changed atom is inside and all surrounding chunks, since a camera's vision could leak onto another chunk. If there is no AI Eye, we instead
|
||||
flag the chunk to update whenever it is loaded by an AI Eye. This is basically how the chunks update and keep it in sync. We then add some lag reducing
|
||||
measures, such as an UPDATE_BUFFER which stops a chunk from updating too many times in a certain time-frame, only updating if the changed atom was blocking
|
||||
sight; for example, we don't update glass airlocks or floors.
|
||||
The chunks are not created straight away, only when an AI eye moves into it's area is when it gets created.
|
||||
One a chunk is created, when a non glass door opens/closes or an opacity turf is destroyed, we check to see if an AI Eye is looking in the area.
|
||||
We do this with the "seenby" list, which updates everytime an AI is near a chunk. If there is an AI eye inside the area, we update the chunk
|
||||
that the changed atom is inside and all surrounding chunks, since a camera's vision could leak onto another chunk. If there is no AI Eye, we instead
|
||||
flag the chunk to update whenever it is loaded by an AI Eye. This is basically how the chunks update and keep it in sync. We then add some lag reducing
|
||||
measures, such as an UPDATE_BUFFER which stops a chunk from updating too many times in a certain time-frame, only updating if the changed atom was blocking
|
||||
sight; for example, we don't update glass airlocks or floors.
|
||||
|
||||
|
||||
WHERE IS EVERYTHING?
|
||||
WHERE IS EVERYTHING?
|
||||
|
||||
cameranet.dm = Everything about the cameranet datum.
|
||||
chunk.dm = Everything about the chunk datum.
|
||||
eye.dm = Everything about the AI and the AIEye.
|
||||
updating.dm = Everything about triggers that will update chunks.
|
||||
cameranet.dm = Everything about the cameranet datum.
|
||||
chunk.dm = Everything about the chunk datum.
|
||||
eye.dm = Everything about the AI and the AIEye.
|
||||
updating.dm = Everything about triggers that will update chunks.
|
||||
|
||||
*/
|
||||
|
||||
@@ -48,7 +48,7 @@ note dizziness decrements automatically in the mob's Life() proc.
|
||||
/mob/proc/make_jittery(var/amount)
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/make_jittery(amount)
|
||||
/mob/living/carbon/human/make_jittery(amount)
|
||||
jitteriness = min(1000, jitteriness + amount) // store what will be new value
|
||||
// clamped to max 1000
|
||||
if(jitteriness > 100 && !is_jittery && stat != DEAD && !(status_flags & FAKEDEATH))
|
||||
|
||||
@@ -327,7 +327,7 @@ var/list/cleanbot_types // Going to use this to generate a list of types once th
|
||||
// This just generates the global list if it hasn't been done already, quick process.
|
||||
cleanbot_types = typesof(/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/vomit,\
|
||||
/obj/effect/decal/cleanable/crayon,/obj/effect/decal/cleanable/liquid_fuel,/obj/effect/decal/cleanable/mucus,/obj/effect/decal/cleanable/dirt)
|
||||
// I honestly forgot you could pass multiple types to typesof() until I accidentally did it here.
|
||||
// I honestly forgot you could pass multiple types to typesof() until I accidentally did it here.
|
||||
target_types = cleanbot_types.Copy()
|
||||
if(!cleans_blood)
|
||||
target_types -= typesof(/obj/effect/decal/cleanable/blood)-typesof(/obj/effect/decal/cleanable/blood/oil)
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
continue
|
||||
if(!process_tray(tray)) //If there's nothing for us to do with the plant, ignore this tray.
|
||||
continue
|
||||
if(pathfind(tray)) //If we can get there, we can accept it as a target.
|
||||
if(pathfind(tray)) //If we can get there, we can accept it as a target.
|
||||
target = tray
|
||||
frustration = 0
|
||||
break
|
||||
@@ -190,7 +190,7 @@
|
||||
if(!length(freespaces))
|
||||
return FALSE
|
||||
|
||||
//If we got here, we know there's a space around it that we can use to access the tray/target. Let's try to find a path to it.
|
||||
//If we got here, we know there's a space around it that we can use to access the tray/target. Let's try to find a path to it.
|
||||
var/turf/location_goal = pick(freespaces)
|
||||
path = AStar(loc, location_goal, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id = botcard)
|
||||
if(!path)
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
to_chat(H, SPAN_DANGER("You sense great disturbance to your physical body!"))
|
||||
else if(!vr_mob)
|
||||
user.visible_message("<span class='danger'>[user] attacks [src] with [I] waking [get_pronoun("him")] up!</span>", \
|
||||
"<span class='danger'>You attack [src] with [I], but they do not respond... Maybe they have S.S.D?</span>")
|
||||
"<span class='danger'>You attack [src] with [I], but they do not respond... Maybe they have S.S.D?</span>")
|
||||
else if(client && willfully_sleeping)
|
||||
user.visible_message("<span class='danger'>[user] attacked [src] with [I] waking [get_pronoun("him")] up!</span>", \
|
||||
"<span class='danger'>You attack [src] with [I], waking [get_pronoun("him")] up!</span>")
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
if(!I)
|
||||
to_chat(usr, SPAN_WARNING("You don't have anything in your hands to give to \the [target]."))
|
||||
return
|
||||
|
||||
|
||||
if(I.too_heavy_to_throw())
|
||||
to_chat(src, SPAN_WARNING("You can barely lift \the [I] up, how do you expect to hand it over to someone?"))
|
||||
return FALSE
|
||||
@@ -48,4 +48,4 @@
|
||||
I.on_give(usr, target)
|
||||
if(!QDELETED(I)) // if on_give deletes the item, we don't want runtimes below
|
||||
target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea.
|
||||
usr.visible_message("<b>[usr]</b> hands [target] \a [I].", SPAN_NOTICE("You give \the [target] a [I]."))
|
||||
usr.visible_message("<b>[usr]</b> hands [target] \a [I].", SPAN_NOTICE("You give \the [target] a [I]."))
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#define PPM 9 //Protein per meat, used for calculating the quantity of protein in an animal
|
||||
#define PPM 9 //Protein per meat, used for calculating the quantity of protein in an animal
|
||||
|
||||
/**
|
||||
* Attempt to devour victim
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
|
||||
/mob/living/carbon/human/get_jump_distance()
|
||||
. = species.standing_jump_range
|
||||
|
||||
|
||||
var/obj/item/organ/internal/augment/suspension/suspension = internal_organs_by_name[BP_AUG_SUSPENSION]
|
||||
|
||||
if(suspension && . < 3)
|
||||
. = max(. + suspension.jump_bonus, 3)
|
||||
. = max(. + suspension.jump_bonus, 3)
|
||||
|
||||
/mob/living/carbon/human/can_do_maneuver(var/singleton/maneuver/maneuver, var/silent = FALSE)
|
||||
. = ..()
|
||||
|
||||
@@ -101,12 +101,12 @@
|
||||
|
||||
|
||||
/*
|
||||
***Deprecated***
|
||||
let this be handled at the hear_say or hear_radio proc
|
||||
This is left in for robot speaking when humans gain binary channel access until I get around to rewriting
|
||||
robot_talk() proc.
|
||||
There is no language handling build into it however there is at the /mob level so we accept the call
|
||||
for it but just ignore it.
|
||||
***Deprecated***
|
||||
let this be handled at the hear_say or hear_radio proc
|
||||
This is left in for robot speaking when humans gain binary channel access until I get around to rewriting
|
||||
robot_talk() proc.
|
||||
There is no language handling build into it however there is at the /mob level so we accept the call
|
||||
for it but just ignore it.
|
||||
*/
|
||||
|
||||
/mob/living/carbon/human/say_quote(var/message, var/datum/language/speaking = null, var/singing = FALSE, var/whisper = FALSE)
|
||||
|
||||
@@ -159,8 +159,7 @@
|
||||
var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure.
|
||||
var/light_dam // If set, mob will be damaged in light over this value and heal in light below its negative.
|
||||
var/breathing_sound = 'sound/voice/monkey.ogg' // If set, this mob will have a breathing sound.
|
||||
var/body_temperature = 310.15 // Non-IS_SYNTHETIC species will try to stabilize at this temperature.
|
||||
// (also affects temperature processing)
|
||||
var/body_temperature = 310.15 // Non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing)
|
||||
|
||||
var/heat_discomfort_level = 315 // Aesthetic messages about feeling warm.
|
||||
var/cold_discomfort_level = 285 // Aesthetic messages about feeling chilly.
|
||||
@@ -239,7 +238,7 @@
|
||||
var/max_hydration_factor = 1 //Multiplier on maximum thirst
|
||||
var/hydration_loss_factor = 1 //Multiplier on passive thirst losses
|
||||
|
||||
// Determines the organs that the species spawns with and
|
||||
///Determines the organs that the species spawns with and
|
||||
var/list/has_organ = list( // which required-organ checks are conducted.
|
||||
BP_HEART = /obj/item/organ/internal/heart,
|
||||
BP_LUNGS = /obj/item/organ/internal/lungs,
|
||||
|
||||
@@ -8,4 +8,4 @@
|
||||
if(C.nutrition <= C.max_nutrition * 0.05)
|
||||
to_chat(C, SPAN_WARNING("We cannot support our summoned apparitions with our biomass any longer..."))
|
||||
return FALSE
|
||||
return TRUE
|
||||
return TRUE
|
||||
|
||||
@@ -1,20 +1,22 @@
|
||||
var/global/list/golem_types = list(SPECIES_GOLEM_COAL,
|
||||
SPECIES_GOLEM_IRON,
|
||||
SPECIES_GOLEM_BRONZE,
|
||||
SPECIES_GOLEM_STEEL,
|
||||
SPECIES_GOLEM_PLASTEEL,
|
||||
SPECIES_GOLEM_TITANIUM,
|
||||
SPECIES_GOLEM_CLOTH,
|
||||
SPECIES_GOLEM_CARDBOARD,
|
||||
SPECIES_GOLEM_GLASS,
|
||||
SPECIES_GOLEM_PHORON,
|
||||
SPECIES_GOLEM_HYDROGEN,
|
||||
SPECIES_GOLEM_WOOD,
|
||||
SPECIES_GOLEM_DIAMOND,
|
||||
SPECIES_GOLEM_SAND,
|
||||
SPECIES_GOLEM_URANIUM,
|
||||
SPECIES_GOLEM_MEAT,
|
||||
SPECIES_GOLEM_ADAMANTINE)
|
||||
var/global/list/golem_types = list(
|
||||
SPECIES_GOLEM_COAL,
|
||||
SPECIES_GOLEM_IRON,
|
||||
SPECIES_GOLEM_BRONZE,
|
||||
SPECIES_GOLEM_STEEL,
|
||||
SPECIES_GOLEM_PLASTEEL,
|
||||
SPECIES_GOLEM_TITANIUM,
|
||||
SPECIES_GOLEM_CLOTH,
|
||||
SPECIES_GOLEM_CARDBOARD,
|
||||
SPECIES_GOLEM_GLASS,
|
||||
SPECIES_GOLEM_PHORON,
|
||||
SPECIES_GOLEM_HYDROGEN,
|
||||
SPECIES_GOLEM_WOOD,
|
||||
SPECIES_GOLEM_DIAMOND,
|
||||
SPECIES_GOLEM_SAND,
|
||||
SPECIES_GOLEM_URANIUM,
|
||||
SPECIES_GOLEM_MEAT,
|
||||
SPECIES_GOLEM_ADAMANTINE
|
||||
)
|
||||
|
||||
/datum/species/golem
|
||||
name = SPECIES_GOLEM_COAL
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
blurb = "IPCs with humanlike properties. Their focus is on service, civilian, and medical, but there are no \
|
||||
job restrictions. Created in the late days of 2450, the Shell is a controversial IPC model equipped with a synthskin weave applied over its metal chassis \
|
||||
to create an uncannily close approximation of the organic form. Early models of Shell had the advantage of being able to compose themselves of a wide \
|
||||
variety of organic parts, but contemporary models have been restricted to a single species for the sake of prosthetic integrity. The additional weight of \
|
||||
the synthskin on the original Hephaestus frame reduces the efficacy of the unit's already strained coolant systems, and increases charge consumption."
|
||||
variety of organic parts, but contemporary models have been restricted to a single species for the sake of prosthetic integrity. The additional weight of \
|
||||
the synthskin on the original Hephaestus frame reduces the efficacy of the unit's already strained coolant systems, and increases charge consumption."
|
||||
|
||||
num_alternate_languages = 3
|
||||
|
||||
|
||||
@@ -105,14 +105,14 @@
|
||||
)
|
||||
|
||||
has_organ = list(
|
||||
BP_BRAIN = /obj/item/organ/internal/brain/unathi,
|
||||
BP_HEART = /obj/item/organ/internal/heart/unathi,
|
||||
BP_LIVER = /obj/item/organ/internal/liver/unathi,
|
||||
BP_LUNGS = /obj/item/organ/internal/lungs/unathi,
|
||||
BP_KIDNEYS = /obj/item/organ/internal/kidneys/unathi,
|
||||
BP_STOMACH = /obj/item/organ/internal/stomach/unathi,
|
||||
BP_EYES = /obj/item/organ/internal/eyes/unathi
|
||||
)
|
||||
BP_BRAIN = /obj/item/organ/internal/brain/unathi,
|
||||
BP_HEART = /obj/item/organ/internal/heart/unathi,
|
||||
BP_LIVER = /obj/item/organ/internal/liver/unathi,
|
||||
BP_LUNGS = /obj/item/organ/internal/lungs/unathi,
|
||||
BP_KIDNEYS = /obj/item/organ/internal/kidneys/unathi,
|
||||
BP_STOMACH = /obj/item/organ/internal/stomach/unathi,
|
||||
BP_EYES = /obj/item/organ/internal/eyes/unathi
|
||||
)
|
||||
|
||||
alterable_internal_organs = list(BP_HEART, BP_EYES, BP_LUNGS, BP_LIVER, BP_KIDNEYS, BP_STOMACH)
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
// Are we placing or stripping?
|
||||
var/stripping = target_slot
|
||||
var/obj/item/held = user.get_active_hand()
|
||||
|
||||
|
||||
if(stripping)
|
||||
if(!target_slot.canremove)
|
||||
to_chat(user, "<span class='warning'>You cannot remove \the [src]'s [target_slot.name].</span>")
|
||||
|
||||
@@ -29,9 +29,9 @@ var/mob/living/next_point_time = 0
|
||||
/*one proc, four uses
|
||||
swapping: if it's 1, the mobs are trying to switch, if 0, non-passive is pushing passive
|
||||
default behaviour is:
|
||||
- non-passive mob passes the passive version
|
||||
- passive mob checks to see if its mob_bump_flag is in the non-passive's mob_bump_flags
|
||||
- if si, the proc returns
|
||||
- non-passive mob passes the passive version
|
||||
- passive mob checks to see if its mob_bump_flag is in the non-passive's mob_bump_flags
|
||||
- if si, the proc returns
|
||||
*/
|
||||
/mob/living/proc/can_move_mob(var/mob/living/swapped, swapping = 0, passive = 0)
|
||||
if(!swapped)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/mob/living/Logout()
|
||||
..()
|
||||
if (mind)
|
||||
if (mind)
|
||||
//Per BYOND docs key remains set if the player DCs, becomes null if switching bodies.
|
||||
if(!key) //key and mind have become seperated.
|
||||
if(!key) //key and mind have become seperated.
|
||||
mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body.
|
||||
|
||||
@@ -1,65 +1,65 @@
|
||||
var/list/department_radio_keys = list(
|
||||
":r" = "right ear", ".r" = "right ear",
|
||||
":l" = "left ear", ".l" = "left ear",
|
||||
":i" = "intercom", ".i" = "intercom",
|
||||
":h" = "department", ".h" = "department",
|
||||
":+" = "special", ".+" = "special", //activate radio-specific special functions
|
||||
":a" = "Common", ".a" = "Common",
|
||||
":c" = "Command", ".c" = "Command",
|
||||
":n" = "Science", ".n" = "Science",
|
||||
":m" = "Medical", ".m" = "Medical",
|
||||
":e" = "Engineering", ".e" = "Engineering",
|
||||
":s" = "Security", ".s" = "Security",
|
||||
":q" = "Penal", ".q" = "Penal",
|
||||
":w" = "whisper", ".w" = "whisper",
|
||||
":t" = "Mercenary", ".t" = "Mercenary",
|
||||
":x" = "Raider", ".x" = "Raider",
|
||||
":b" = "Burglar", ".b" = "Burglar",
|
||||
":j" = "Bluespace", ".j" = "Bluespace",
|
||||
":y" = "Hailing", ".y" = "Hailing",
|
||||
":q" = "Ninja", ".q" = "Ninja",
|
||||
":u" = "Operations", ".u" = "Operations",
|
||||
":v" = "Service", ".v" = "Service",
|
||||
":p" = "AI Private", ".p" = "AI Private",
|
||||
":z" = "Entertainment",".z" = "Entertainment",
|
||||
":r" = "right ear", ".r" = "right ear",
|
||||
":l" = "left ear", ".l" = "left ear",
|
||||
":i" = "intercom", ".i" = "intercom",
|
||||
":h" = "department", ".h" = "department",
|
||||
":+" = "special", ".+" = "special", //activate radio-specific special functions
|
||||
":a" = "Common", ".a" = "Common",
|
||||
":c" = "Command", ".c" = "Command",
|
||||
":n" = "Science", ".n" = "Science",
|
||||
":m" = "Medical", ".m" = "Medical",
|
||||
":e" = "Engineering", ".e" = "Engineering",
|
||||
":s" = "Security", ".s" = "Security",
|
||||
":q" = "Penal", ".q" = "Penal",
|
||||
":w" = "whisper", ".w" = "whisper",
|
||||
":t" = "Mercenary", ".t" = "Mercenary",
|
||||
":x" = "Raider", ".x" = "Raider",
|
||||
":b" = "Burglar", ".b" = "Burglar",
|
||||
":j" = "Bluespace", ".j" = "Bluespace",
|
||||
":y" = "Hailing", ".y" = "Hailing",
|
||||
":q" = "Ninja", ".q" = "Ninja",
|
||||
":u" = "Operations", ".u" = "Operations",
|
||||
":v" = "Service", ".v" = "Service",
|
||||
":p" = "AI Private", ".p" = "AI Private",
|
||||
":z" = "Entertainment",".z" = "Entertainment",
|
||||
|
||||
":R" = "right ear", ".R" = "right ear",
|
||||
":L" = "left ear", ".L" = "left ear",
|
||||
":I" = "intercom", ".I" = "intercom",
|
||||
":H" = "department", ".H" = "department",
|
||||
":A" = "Common", ".A" = "Common",
|
||||
":C" = "Command", ".C" = "Command",
|
||||
":N" = "Science", ".N" = "Science",
|
||||
":M" = "Medical", ".M" = "Medical",
|
||||
":E" = "Engineering", ".E" = "Engineering",
|
||||
":S" = "Security", ".S" = "Security",
|
||||
":Q" = "Penal", ".Q" = "Penal",
|
||||
":W" = "whisper", ".W" = "whisper",
|
||||
":T" = "Mercenary", ".T" = "Mercenary",
|
||||
":X" = "Raider", ".X" = "Raider",
|
||||
":B" = "Burglar", ".B" = "Burglar",
|
||||
":J" = "Bluespace", ".J" = "Bluespace",
|
||||
":Y" = "Hailing", ".Y" = "Hailing",
|
||||
":Q" = "Ninja", ".Q" = "Ninja",
|
||||
":U" = "Operations", ".U" = "Operations",
|
||||
":V" = "Service", ".V" = "Service",
|
||||
":P" = "AI Private", ".P" = "AI Private",
|
||||
":Z" = "Entertainment",".Z" = "Entertainment",
|
||||
":R" = "right ear", ".R" = "right ear",
|
||||
":L" = "left ear", ".L" = "left ear",
|
||||
":I" = "intercom", ".I" = "intercom",
|
||||
":H" = "department", ".H" = "department",
|
||||
":A" = "Common", ".A" = "Common",
|
||||
":C" = "Command", ".C" = "Command",
|
||||
":N" = "Science", ".N" = "Science",
|
||||
":M" = "Medical", ".M" = "Medical",
|
||||
":E" = "Engineering", ".E" = "Engineering",
|
||||
":S" = "Security", ".S" = "Security",
|
||||
":Q" = "Penal", ".Q" = "Penal",
|
||||
":W" = "whisper", ".W" = "whisper",
|
||||
":T" = "Mercenary", ".T" = "Mercenary",
|
||||
":X" = "Raider", ".X" = "Raider",
|
||||
":B" = "Burglar", ".B" = "Burglar",
|
||||
":J" = "Bluespace", ".J" = "Bluespace",
|
||||
":Y" = "Hailing", ".Y" = "Hailing",
|
||||
":Q" = "Ninja", ".Q" = "Ninja",
|
||||
":U" = "Operations", ".U" = "Operations",
|
||||
":V" = "Service", ".V" = "Service",
|
||||
":P" = "AI Private", ".P" = "AI Private",
|
||||
":Z" = "Entertainment",".Z" = "Entertainment",
|
||||
|
||||
//kinda localization -- rastaf0
|
||||
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
|
||||
":ê" = "right ear", ".ê" = "right ear",
|
||||
":ä" = "left ear", ".ä" = "left ear",
|
||||
":ø" = "intercom", ".ø" = "intercom",
|
||||
":ð" = "department", ".ð" = "department",
|
||||
":ñ" = "Command", ".ñ" = "Command",
|
||||
":ò" = "Science", ".ò" = "Science",
|
||||
":ü" = "Medical", ".ü" = "Medical",
|
||||
":ó" = "Engineering", ".ó" = "Engineering",
|
||||
":û" = "Security", ".û" = "Security",
|
||||
":ö" = "whisper", ".ö" = "whisper",
|
||||
":å" = "Mercenary", ".å" = "Mercenary",
|
||||
":é" = "Operations", ".é" = "Operations"
|
||||
//kinda localization -- rastaf0
|
||||
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
|
||||
":ê" = "right ear", ".ê" = "right ear",
|
||||
":ä" = "left ear", ".ä" = "left ear",
|
||||
":ø" = "intercom", ".ø" = "intercom",
|
||||
":ð" = "department", ".ð" = "department",
|
||||
":ñ" = "Command", ".ñ" = "Command",
|
||||
":ò" = "Science", ".ò" = "Science",
|
||||
":ü" = "Medical", ".ü" = "Medical",
|
||||
":ó" = "Engineering", ".ó" = "Engineering",
|
||||
":û" = "Security", ".û" = "Security",
|
||||
":ö" = "whisper", ".ö" = "whisper",
|
||||
":å" = "Mercenary", ".å" = "Mercenary",
|
||||
":é" = "Operations", ".é" = "Operations"
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -356,8 +356,8 @@ var/list/ai_verbs_default = list(
|
||||
To use something, simply click on it.</p>\
|
||||
<h2>AI Shell</h2>\
|
||||
<p>As an AI, you have access to an unique, inhabitable AI shell that spawns behind your core.\
|
||||
This construct can be used in a variety of ways, but its primary function is to be a <strong>role play tool</strong> to give you the ability to have an actual physical presence on the station.\
|
||||
The shell is an extension of you, which means <strong>your laws apply to it aswell.</strong>\
|
||||
This construct can be used in a variety of ways, but its primary function is to be a <strong>role play tool</strong> to give you the ability to have an actual physical presence on the station.\
|
||||
The shell is an extension of you, which means <strong>your laws apply to it aswell.</strong>\
|
||||
</p>\
|
||||
<h2>OOC Notes</h2>\
|
||||
<p>Please remember that as an AI <strong>you can heavily skew the game in your (and thus usually the crew's) favour</strong>. \
|
||||
|
||||
@@ -38,11 +38,11 @@ var/global/list/empty_playable_ai_cores = list()
|
||||
if(SSticker.mode && SSticker.mode.name == "AI malfunction")
|
||||
to_chat(usr, "<span class='danger'>You cannot use this verb in malfunction. If you need to leave, please adminhelp.</span>")
|
||||
return
|
||||
|
||||
|
||||
if(carded)
|
||||
to_chat(usr, "<span class='danger'>No connection to station intelligence storage. You must be in an AI Core to store yourself (adminhelp if you need to leave).</span>")
|
||||
return
|
||||
|
||||
|
||||
// Guard against misclicks, this isn't the sort of thing we want happening accidentally
|
||||
if(alert("WARNING: This will immediately wipe your core and ghost you, removing your character from the round permanently (similar to cryo and robotic storage). Are you entirely sure you want to do this?",
|
||||
"Wipe Core", "No", "No", "Yes") != "Yes")
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
return all_languages[LANGUAGE_LOCAL_DRONE]
|
||||
|
||||
/mob/living/silicon/robot/drone/fall_impact()
|
||||
..(damage_mod = 0.25) //reduces fall damage by 75%
|
||||
..(damage_mod = 0.25) //reduces fall damage by 75%
|
||||
|
||||
/mob/living/silicon/robot/drone/construction
|
||||
// Look and feel
|
||||
|
||||
@@ -129,7 +129,7 @@
|
||||
to_chat(D, SPAN_WARNING("You need to remain still while decompiling such a large object."))
|
||||
is_decompiling = FALSE
|
||||
return
|
||||
|
||||
|
||||
is_decompiling = FALSE
|
||||
if(!M || !D)
|
||||
return
|
||||
@@ -159,10 +159,10 @@
|
||||
if(istype(victim, /mob/living/simple_animal/borer) && M.stat != DEAD)
|
||||
to_chat(user, SPAN_WARNING("You can't seem to get \the [victim] into your [name]!"))
|
||||
return
|
||||
|
||||
|
||||
//We're good to crunch them up
|
||||
var/turf/T = get_turf(src)
|
||||
T.visible_message(SPAN_DANGER("\The [user] sucks \the [victim] into its decompiler. There's a horrible crunching noise."),
|
||||
T.visible_message(SPAN_DANGER("\The [user] sucks \the [victim] into its decompiler. There's a horrible crunching noise."),
|
||||
SPAN_NOTICE("It's a bit of a struggle, but you manage to suck \the [victim] into your decompiler. It makes a series of visceral crunching noises."))
|
||||
new /obj/effect/decal/cleanable/blood/splatter(get_turf(src))
|
||||
playsound(get_turf(user), 'sound/effects/squelch1.ogg')
|
||||
|
||||
@@ -265,7 +265,7 @@
|
||||
uneq_active()
|
||||
|
||||
/mob/living/silicon/robot/drop_from_inventory(var/obj/item/W, var/atom/target = null)
|
||||
var/do_feedback = target ? FALSE : TRUE //Do not do feedback messages if dropping to a target, to avoid duplicate "You release X" messages.
|
||||
var/do_feedback = target ? FALSE : TRUE //Do not do feedback messages if dropping to a target, to avoid duplicate "You release X" messages.
|
||||
if(W)
|
||||
if(!target)
|
||||
target = loc
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
if(!length(components))
|
||||
return
|
||||
|
||||
//Combat shielding absorbs a percentage of damage directly into the cell.
|
||||
//Combat shielding absorbs a percentage of damage directly into the cell.
|
||||
if(module_active && istype(module_active, /obj/item/borg/combat/shield))
|
||||
var/obj/item/borg/combat/shield/shield = module_active
|
||||
//Shields absorb a certain percentage of damage based on their power setting.
|
||||
@@ -121,7 +121,7 @@
|
||||
return
|
||||
|
||||
var/list/datum/robot_component/parts = get_damageable_components()
|
||||
//Combat shielding absorbs a percentage of damage directly into the cell.
|
||||
//Combat shielding absorbs a percentage of damage directly into the cell.
|
||||
if(module_active && istype(module_active,/obj/item/borg/combat/shield))
|
||||
var/obj/item/borg/combat/shield/shield = module_active
|
||||
//Shields absorb a certain percentage of damage based on their power setting.
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
M.apply_damage(min(strength*0.85,2)+mut, DAMAGE_BURN, damage_flags = DAMAGE_FLAG_SHARP) // Stinging. The more mutated I am, the harder I sting.
|
||||
var/venom_strength = max(strength*0.2, (round(feral/10,1) * (max(round(strength/20,1), 1)))) + toxic // Bee venom based on how angry I am and how many there are of me!
|
||||
M.apply_damage(venom_strength, DAMAGE_PAIN) //Bee venom causes pain, not organ failure
|
||||
if(prob(max(80, strength * 10))) //If there's enough of a swarm, it can also cause breathing trouble. Yes, even without being allergic.
|
||||
if(prob(max(80, strength * 10))) //If there's enough of a swarm, it can also cause breathing trouble. Yes, even without being allergic.
|
||||
M.apply_damage(venom_strength, DAMAGE_OXY)
|
||||
update_icon()
|
||||
to_chat(M, "<span class='warning'>You have been stung!</span>")
|
||||
@@ -290,4 +290,4 @@
|
||||
/mob/living/simple_animal/bee/beegun/Initialize()
|
||||
. = ..()
|
||||
mut = rand(0, 1) //We're creating bees out of energy. They have a chance of being mutated...
|
||||
toxic = rand(0, 1) //...or slightly more toxic
|
||||
toxic = rand(0, 1) //...or slightly more toxic
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/mob/living/simple_animal/borer/send_emote(var/message, var/type)
|
||||
if(host)
|
||||
if(host.stat == CONSCIOUS)
|
||||
host.show_message(message, type)
|
||||
else
|
||||
..()
|
||||
if(host)
|
||||
if(host.stat == CONSCIOUS)
|
||||
host.show_message(message, type)
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -246,10 +246,15 @@
|
||||
audible_emote(pick("[verb] in distress.", "[verb] anxiously."))
|
||||
else
|
||||
if (prob(5))
|
||||
visible_emote(pick("nuzzles [friend].",
|
||||
"brushes against [friend].",
|
||||
"rubs against [friend].",
|
||||
"purrs."),0)
|
||||
var/emote = pick(
|
||||
"nuzzles [friend].",
|
||||
"brushes against [friend].",
|
||||
"rubs against [friend].",
|
||||
"purrs.",
|
||||
)
|
||||
|
||||
visible_emote(emote, 0)
|
||||
|
||||
else if (friend.health <= 50)
|
||||
if (prob(10))
|
||||
var/verb = pick("meows", "mews", "mrowls")
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
laser = ARMOR_LASER_PISTOL
|
||||
)
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/beast/charbaby/on_attack_mob(var/mob/hit_mob)
|
||||
/mob/living/simple_animal/hostile/retaliate/beast/charbaby/on_attack_mob(var/mob/hit_mob)
|
||||
. = ..()
|
||||
if(isliving(hit_mob) && prob(25))
|
||||
var/mob/living/L = hit_mob
|
||||
@@ -68,4 +68,4 @@
|
||||
icon_living = "lavadog"
|
||||
icon_dead = "lavadog_dead"
|
||||
|
||||
speak = list("Karuph!", "Karump!")
|
||||
speak = list("Karuph!", "Karump!")
|
||||
|
||||
@@ -105,9 +105,9 @@
|
||||
health = 50
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/russian/FindTarget()
|
||||
. = ..()
|
||||
if(.)
|
||||
custom_emote(VISIBLE_MESSAGE,"spots a filthy capitalist!")
|
||||
. = ..()
|
||||
if(.)
|
||||
custom_emote(VISIBLE_MESSAGE,"spots a filthy capitalist!")
|
||||
|
||||
/mob/living/simple_animal/hostile/carp/asteroid
|
||||
icon_state = "carp_asteroid"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
/mob/living/simple_animal/illusion/Destroy()
|
||||
copying = null
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
// Because we can't perfectly duplicate some examine() output, we directly examine the AM it is copying. It's messy but
|
||||
// this is to prevent easy checks from the opposing force.
|
||||
|
||||
@@ -100,10 +100,12 @@
|
||||
|
||||
parrot_sleep_dur = parrot_sleep_max //In case someone decides to change the max without changing the duration var
|
||||
|
||||
verbs.Add(/mob/living/simple_animal/parrot/proc/steal_from_ground, \
|
||||
/mob/living/simple_animal/parrot/proc/steal_from_mob, \
|
||||
/mob/living/simple_animal/parrot/verb/drop_held_item_player, \
|
||||
/mob/living/simple_animal/parrot/proc/perch_player)
|
||||
verbs.Add(
|
||||
/mob/living/simple_animal/parrot/proc/steal_from_ground, \
|
||||
/mob/living/simple_animal/parrot/proc/steal_from_mob, \
|
||||
/mob/living/simple_animal/parrot/verb/drop_held_item_player, \
|
||||
/mob/living/simple_animal/parrot/proc/perch_player
|
||||
)
|
||||
|
||||
/mob/living/simple_animal/parrot/Destroy()
|
||||
QDEL_NULL(ears)
|
||||
@@ -288,9 +290,9 @@
|
||||
|
||||
//-----SPEECH
|
||||
/* Parrot speech mimickry!
|
||||
Phrases that the parrot hears in mob/living/say() get added to speach_buffer.
|
||||
Every once in a while, the parrot picks one of the lines from the buffer and replaces an element of the 'speech' list.
|
||||
Then it clears the buffer to make sure they dont magically remember something from hours ago. */
|
||||
Phrases that the parrot hears in mob/living/say() get added to speach_buffer.
|
||||
Every once in a while, the parrot picks one of the lines from the buffer and replaces an element of the 'speech' list.
|
||||
Then it clears the buffer to make sure they dont magically remember something from hours ago. */
|
||||
if(speech_buffer.len && prob(10))
|
||||
if(speak.len)
|
||||
speak.Remove(pick(speak))
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
else if(get_dist(src, M) <= watching_range)
|
||||
if(M.stat == DEAD && M.client)
|
||||
observers += M
|
||||
else
|
||||
else
|
||||
watching += M
|
||||
|
||||
if(length(observers)) //For ghosts who do NOT have ghost ears. They will see the whole message if nearby, no *s or not_heard messages.
|
||||
|
||||
@@ -86,12 +86,12 @@
|
||||
return FALSE
|
||||
|
||||
/*
|
||||
***Deprecated***
|
||||
let this be handled at the hear_say or hear_radio proc
|
||||
This is left in for robot speaking when humans gain binary channel access until I get around to rewriting
|
||||
robot_talk() proc.
|
||||
There is no language handling build into it however there is at the /mob level so we accept the call
|
||||
for it but just ignore it.
|
||||
***Deprecated***
|
||||
let this be handled at the hear_say or hear_radio proc
|
||||
This is left in for robot speaking when humans gain binary channel access until I get around to rewriting
|
||||
robot_talk() proc.
|
||||
There is no language handling build into it however there is at the /mob level so we accept the call
|
||||
for it but just ignore it.
|
||||
*/
|
||||
|
||||
/mob/proc/say_quote(var/message, var/datum/language/speaking = null, var/singing = FALSE, var/whisper = FALSE)
|
||||
|
||||
Reference in New Issue
Block a user