mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-26 05:27:39 +01:00
Merge remote-tracking branch 'upstream/dev-freeze' into dev
Conflicts: code/_helpers/names.dm code/game/jobs/job/silicon.dm code/game/objects/items.dm code/modules/mining/abandonedcrates.dm code/modules/mob/living/carbon/brain/life.dm code/modules/mob/living/carbon/human/life.dm code/modules/mob/living/simple_animal/friendly/spiderbot.dm code/modules/nano/modules/alarm_monitor.dm code/setup.dm
This commit is contained in:
@@ -302,7 +302,11 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
|
||||
output += "<option value='[j]'>[j]</option>"
|
||||
for(var/j in nonhuman_positions)
|
||||
output += "<option value='[j]'>[j]</option>"
|
||||
for(var/j in list("traitor","changeling","operative","revolutionary","cultist","wizard"))
|
||||
var/list/bantypes = list("traitor","changeling","operative","revolutionary","cultist","wizard") //For legacy bans.
|
||||
for(var/antag_type in all_antag_types) // Grab other bans.
|
||||
var/datum/antagonist/antag = all_antag_types[antag_type]
|
||||
bantypes |= antag.bantype
|
||||
for(var/j in bantypes)
|
||||
output += "<option value='[j]'>[j]</option>"
|
||||
output += "</select></td></tr></table>"
|
||||
output += "<b>Reason:<br></b><textarea name='dbbanreason' cols='50'></textarea><br>"
|
||||
|
||||
@@ -441,7 +441,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
|
||||
//Announces the character on all the systems, based on the record.
|
||||
if(!issilicon(new_character))//If they are not a cyborg/AI.
|
||||
if(!record_found&&new_character.mind.assigned_role!="MODE")//If there are no records for them. If they have a record, this info is already in there. MODE people are not announced anyway.
|
||||
if(!record_found && !player_is_antag(new_character.mind, only_offstation_roles = 1)) //If there are no records for them. If they have a record, this info is already in there. MODE people are not announced anyway.
|
||||
//Power to the user!
|
||||
if(alert(new_character,"Warning: No data core entry detected. Would you like to announce the arrival of this character by adding them to various databases, such as medical records?",,"No","Yes")=="Yes")
|
||||
data_core.manifest_inject(new_character)
|
||||
@@ -468,7 +468,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
for(var/mob/living/silicon/ai/M in mob_list)
|
||||
if (M.stat == 2)
|
||||
usr << "Upload failed. No signal is being detected from the AI."
|
||||
else if (M.see_in_dark == 0)
|
||||
else if (!M.has_power)
|
||||
usr << "Upload failed. Only a faint signal is being detected from the AI, and it is not responding to our requests. It may be low on power."
|
||||
else
|
||||
M.add_ion_law(input)
|
||||
|
||||
@@ -4,6 +4,7 @@ var/list/preferences_datums = list()
|
||||
|
||||
var/global/list/special_roles = list( //keep synced with the defines BE_* in setup.dm --rastaf
|
||||
//some autodetection here.
|
||||
// TODO: Update to new antagonist system.
|
||||
"traitor" = IS_MODE_COMPILED("traitor"), // 0
|
||||
"operative" = IS_MODE_COMPILED("nuclear"), // 1
|
||||
"changeling" = IS_MODE_COMPILED("changeling"), // 2
|
||||
|
||||
@@ -66,7 +66,6 @@
|
||||
icon_state = "vox-carapace"
|
||||
item_state = "vox-carapace"
|
||||
desc = "A glowing visor, perhaps stolen from a depressed Cylon."
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
|
||||
/obj/item/clothing/suit/space/vox/carapace
|
||||
name = "alien carapace armour"
|
||||
|
||||
@@ -119,10 +119,8 @@
|
||||
H << "<span class='warning'>You cannot use your teleporter on this Z-level.</span>"
|
||||
return 0
|
||||
|
||||
for(var/atom/A in T)
|
||||
if(A.density && !(A.flags & ON_BORDER))
|
||||
H << "<span class='warning'>You cannot teleport to a location with solid objects.</span>"
|
||||
return 0
|
||||
if(T.contains_dense_objects())
|
||||
H << "<span class='warning'>You cannot teleport to a location with solid objects.</span>"
|
||||
|
||||
phase_out(H,get_turf(H))
|
||||
H.loc = T
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
endWhen = rand(500, 1500)
|
||||
// command_alert("The station has entered an ion storm. Monitor all electronic equipment for malfunctions", "Anomaly Alert")
|
||||
for (var/mob/living/carbon/human/player in player_list)
|
||||
if( !player.mind || player.mind.assigned_role == "MODE" || player.client.inactivity > MinutesToTicks(10))
|
||||
if( !player.mind || player_is_antag(player.mind, only_offstation_roles = 1) || player.client.inactivity > MinutesToTicks(10))
|
||||
continue
|
||||
players += player.real_name
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#define LIGHTING_FALLOFF 1 // type of falloff to use for lighting; 1 for circular, 2 for square
|
||||
#define LIGHTING_LAMBERTIAN 1 // use lambertian shading for light sources
|
||||
#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone
|
||||
#define LIGHTING_TRANSITIONS 1 // smooth, animated transitions, similar to /tg/station
|
||||
#define LIGHTING_ROUND_VALUE (1 / 128) //Value used to round lumcounts, values smaller than 1/255 don't matter (if they do, thanks sinking points), greater values will make lighting less precise, but in turn increase performance, VERY SLIGHTLY.
|
||||
|
||||
#define LIGHTING_LAYER 10 // drawing layer for lighting overlays
|
||||
|
||||
@@ -143,15 +143,19 @@
|
||||
if(!strength) //Don't add turfs that aren't affected to the affected turfs.
|
||||
continue
|
||||
|
||||
effect_r[T.lighting_overlay] = round(lum_r * strength, LIGHTING_ROUND_VALUE)
|
||||
effect_g[T.lighting_overlay] = round(lum_g * strength, LIGHTING_ROUND_VALUE)
|
||||
effect_b[T.lighting_overlay] = round(lum_b * strength, LIGHTING_ROUND_VALUE)
|
||||
effect_r += round(lum_r * strength, LIGHTING_ROUND_VALUE)
|
||||
effect_g += round(lum_g * strength, LIGHTING_ROUND_VALUE)
|
||||
effect_b += round(lum_b * strength, LIGHTING_ROUND_VALUE)
|
||||
|
||||
T.lighting_overlay.update_lumcount(
|
||||
round(lum_r * strength, LIGHTING_ROUND_VALUE),
|
||||
round(lum_g * strength, LIGHTING_ROUND_VALUE),
|
||||
round(lum_b * strength, LIGHTING_ROUND_VALUE)
|
||||
)
|
||||
else
|
||||
effect_r += 0
|
||||
effect_g += 0
|
||||
effect_b += 0
|
||||
|
||||
if(!T.affecting_lights)
|
||||
T.affecting_lights = list()
|
||||
@@ -161,12 +165,15 @@
|
||||
|
||||
/datum/light_source/proc/remove_lum()
|
||||
applied = 0
|
||||
var/i = 1
|
||||
for(var/turf/T in effect_turf)
|
||||
if(T.affecting_lights)
|
||||
T.affecting_lights -= src
|
||||
|
||||
if(T.lighting_overlay)
|
||||
T.lighting_overlay.update_lumcount(-effect_r[T.lighting_overlay], -effect_g[T.lighting_overlay], -effect_b[T.lighting_overlay])
|
||||
T.lighting_overlay.update_lumcount(-effect_r[i], -effect_g[i], -effect_b[i])
|
||||
|
||||
i++
|
||||
|
||||
effect_r.Cut()
|
||||
effect_g.Cut()
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
icon_state = "light1"
|
||||
layer = LIGHTING_LAYER
|
||||
invisibility = INVISIBILITY_LIGHTING
|
||||
blend_mode = BLEND_MULTIPLY
|
||||
color = "#000000"
|
||||
|
||||
var/lum_r
|
||||
@@ -53,32 +52,31 @@
|
||||
lighting_update_overlays += src
|
||||
|
||||
/atom/movable/lighting_overlay/proc/update_overlay()
|
||||
var/mx = max(lum_r, lum_g, lum_b)
|
||||
. = 1 // factor
|
||||
if(mx > 1)
|
||||
. = 1/mx
|
||||
#if LIGHTING_TRANSITIONS == 1
|
||||
animate(src,
|
||||
color = rgb(lum_r * 255 * ., lum_g * 255 * ., lum_b * 255 * .),
|
||||
LIGHTING_INTERVAL - 1
|
||||
)
|
||||
#else
|
||||
color = rgb(lum_r * 255 * ., lum_g * 255 * ., lum_b * 255 * .)
|
||||
#endif
|
||||
|
||||
var/turf/T = loc
|
||||
|
||||
if(istype(T)) //Incase we're not on a turf, pool ourselves, something happened.
|
||||
if(color != "#000000")
|
||||
T.luminosity = 1
|
||||
else //No light, set the turf's luminosity to 0 to remove it from view()
|
||||
#if LIGHTING_TRANSITIONS == 1
|
||||
spawn(LIGHTING_INTERVAL - 1)
|
||||
if(lum_r == lum_g && lum_r == lum_b) //greyscale
|
||||
blend_mode = BLEND_OVERLAY
|
||||
if(lum_r <= 0)
|
||||
T.luminosity = 0
|
||||
color = "#000000"
|
||||
alpha = 255
|
||||
else
|
||||
T.luminosity = 1
|
||||
color = "#000000"
|
||||
alpha = (1 - min(lum_r, 1)) * 255
|
||||
else
|
||||
alpha = 255
|
||||
var/mx = max(lum_r, lum_g, lum_b)
|
||||
. = 1 // factor
|
||||
if(mx > 1)
|
||||
. = 1/mx
|
||||
blend_mode = BLEND_MULTIPLY
|
||||
color = rgb(lum_r * 255 * ., lum_g * 255 * ., lum_b * 255 * .)
|
||||
if(color != "#000000")
|
||||
T.luminosity = 1
|
||||
else //No light, set the turf's luminosity to 0 to remove it from view()
|
||||
T.luminosity = 0
|
||||
#else
|
||||
T.luminosity = 0
|
||||
#endif
|
||||
|
||||
else
|
||||
warning("A lighting overlay realised its loc was NOT a turf (actual loc: [loc][loc ? ", " + loc.type : ""]) in update_overlay() and got pooled!")
|
||||
qdel(src)
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#undef LIGHTING_FALLOFF
|
||||
#undef LIGHTING_LAMBERTIAN
|
||||
#undef LIGHTING_HEIGHT
|
||||
#undef LIGHTING_TRANSITIONS
|
||||
|
||||
#undef LIGHTING_RESOLUTION
|
||||
#undef LIGHTING_LAYER
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
icon_state = "securecrate"
|
||||
icon_opened = "securecrateopen"
|
||||
icon_closed = "securecrate"
|
||||
var/code = null
|
||||
var/lastattempt = null
|
||||
var/list/code = list()
|
||||
var/list/lastattempt = list()
|
||||
var/attempts = 10
|
||||
var/codelen = 4
|
||||
locked = 1
|
||||
@@ -14,12 +14,12 @@
|
||||
..()
|
||||
var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
|
||||
|
||||
code = ""
|
||||
for(var/i = 0, i < codelen, i++)
|
||||
var/dig = pick(digits)
|
||||
code += dig
|
||||
digits -= dig // Player can enter codes with matching digits, but there are never matching digits in the answer
|
||||
for(var/i in 1 to codelen)
|
||||
code += pick(digits)
|
||||
|
||||
generate_loot()
|
||||
|
||||
/obj/structure/closet/crate/secure/loot/proc/generate_loot()
|
||||
var/loot = rand(1, 100)
|
||||
switch(loot)
|
||||
if(1 to 5) // Common things go, 5%
|
||||
@@ -145,60 +145,65 @@
|
||||
new/obj/item/clothing/head/bearpelt(src)
|
||||
|
||||
/obj/structure/closet/crate/secure/loot/togglelock(mob/user as mob)
|
||||
if(locked)
|
||||
user << "<span class='notice'>The crate is locked with a Deca-code lock.</span>"
|
||||
var/input = input(usr, "Enter [codelen] digits.", "Deca-Code Lock", "") as text
|
||||
if(in_range(src, user))
|
||||
if (input == code)
|
||||
user << "<span class='notice'>The crate unlocks!</span>"
|
||||
locked = 0
|
||||
overlays.Cut()
|
||||
overlays += greenlight
|
||||
else if (input == null || length(input) != codelen)
|
||||
user << "<span class='notice'>You leave the crate alone.</span>"
|
||||
else
|
||||
user << "<span class='warning'>A red light flashes.</span>"
|
||||
lastattempt = input
|
||||
attempts--
|
||||
if (attempts == 0)
|
||||
user << "<span class='danger'>The crate's anti-tamper system activates!</span>"
|
||||
var/turf/T = get_turf(src.loc)
|
||||
explosion(T, 0, 0, 0, 1)
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
user << "<span class='notice'>You attempt to interact with the device using a hand gesture, but it appears this crate is from before the DECANECT came out.</span>"
|
||||
return
|
||||
if(!locked)
|
||||
return
|
||||
|
||||
user << "<span class='notice'>The crate is locked with a Deca-code lock.</span>"
|
||||
var/input = input(user, "Enter [codelen] digits.", "Deca-Code Lock", "") as text
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
|
||||
if(input == null || length(input) != codelen)
|
||||
user << "<span class='notice'>You leave the crate alone.</span>"
|
||||
else if(check_input(input))
|
||||
user << "<span class='notice'>The crate unlocks!</span>"
|
||||
playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
|
||||
set_locked(0)
|
||||
else
|
||||
return ..()
|
||||
visible_message("<span class='warning'>A red light on \the [src]'s control panel flashes briefly.</span>")
|
||||
attempts--
|
||||
if (attempts == 0)
|
||||
user << "<span class='danger'>The crate's anti-tamper system activates!</span>"
|
||||
var/turf/T = get_turf(src.loc)
|
||||
explosion(T, 0, 0, 1, 2)
|
||||
del(src)
|
||||
|
||||
/obj/structure/closet/crate/secure/loot/emag_act(var/remaining_charges, var/mob/user)
|
||||
if (locked)
|
||||
user << "<span class='notice'>The crate unlocks!</span>"
|
||||
locked = 0
|
||||
|
||||
/obj/structure/closet/crate/secure/loot/proc/check_input(var/input)
|
||||
if(length(input) != codelen)
|
||||
return 0
|
||||
|
||||
. = 1
|
||||
lastattempt.Cut()
|
||||
for(var/i in 1 to codelen)
|
||||
var/guesschar = copytext(input, i, i+1)
|
||||
lastattempt += guesschar
|
||||
if(guesschar != code[i])
|
||||
. = 0
|
||||
|
||||
/obj/structure/closet/crate/secure/loot/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(locked)
|
||||
if (istype(W, /obj/item/device/multitool)) // Greetings Urist McProfessor, how about a nice game of cows and bulls?
|
||||
user << "<span class='notice'>DECA-CODE LOCK REPORT:</span>"
|
||||
user << "<span class='notice'>DECA-CODE LOCK ANALYSIS:</span>"
|
||||
if (attempts == 1)
|
||||
user << "<span class='warning'>* Anti-Tamper Bomb will activate on next failed access attempt.</span>"
|
||||
user << "<span class='warning'>* Anti-Tamper system will activate on the next failed access attempt.</span>"
|
||||
else
|
||||
user << "<span class='notice'>* Anti-Tamper Bomb will activate after [src.attempts] failed access attempts.</span>"
|
||||
if (lastattempt != null)
|
||||
var/list/guess = list()
|
||||
user << "<span class='notice'>* Anti-Tamper system will activate after [src.attempts] failed access attempts.</span>"
|
||||
if(lastattempt.len)
|
||||
var/bulls = 0
|
||||
var/cows = 0
|
||||
for(var/i = 1, i < codelen + 1, i++)
|
||||
var/a = copytext(lastattempt, i, i+1) // Stuff the code into the list
|
||||
guess += a
|
||||
guess[a] = i
|
||||
for(var/i in guess) // Go through list and count matches
|
||||
var/a = findtext(code, i)
|
||||
if(a == guess[i])
|
||||
|
||||
var/list/code_contents = code.Copy()
|
||||
for(var/i in 1 to codelen)
|
||||
if(lastattempt[i] == code[i])
|
||||
++bulls
|
||||
else if(a)
|
||||
else if(lastattempt[i] in code_contents)
|
||||
++cows
|
||||
code_contents -= lastattempt[i]
|
||||
user << "<span class='notice'>Last code attempt had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions.</span>"
|
||||
else ..()
|
||||
else ..()
|
||||
return
|
||||
..()
|
||||
|
||||
@@ -34,7 +34,6 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images
|
||||
/mob/dead/observer/New(mob/body)
|
||||
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
see_in_dark = 100
|
||||
verbs += /mob/dead/observer/proc/dead_tele
|
||||
|
||||
stat = DEAD
|
||||
@@ -141,17 +140,6 @@ Works together with spawning an observer, noted above.
|
||||
var/client/C = U.client
|
||||
for(var/mob/living/carbon/human/target in target_list)
|
||||
C.images += target.hud_list[SPECIALROLE_HUD]
|
||||
|
||||
|
||||
/*
|
||||
else//If the silicon mob has no law datum, no inherent laws, or a law zero, add them to the hud.
|
||||
var/mob/living/silicon/silicon_target = target
|
||||
if(!silicon_target.laws||(silicon_target.laws&&(silicon_target.laws.zeroth||!silicon_target.laws.inherent.len))||silicon_target.mind.special_role=="traitor")
|
||||
if(isrobot(silicon_target))//Different icons for robutts and AI.
|
||||
U.client.images += image(tempHud,silicon_target,"hudmalborg")
|
||||
else
|
||||
U.client.images += image(tempHud,silicon_target,"hudmalai")
|
||||
*/
|
||||
return 1
|
||||
|
||||
/mob/proc/ghostize(var/can_reenter_corpse = 1)
|
||||
@@ -646,10 +634,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
/mob/dead/observer/proc/updateghostsight()
|
||||
if (!seedarkness)
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING
|
||||
see_in_dark = 100
|
||||
else
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
if (!ghostvision)
|
||||
see_invisible = SEE_INVISIBLE_LIVING;
|
||||
see_in_dark = 0
|
||||
updateghostimages()
|
||||
|
||||
/proc/updateallghostimages()
|
||||
|
||||
@@ -70,7 +70,6 @@
|
||||
blind.layer = 0
|
||||
|
||||
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
|
||||
see_in_dark = 8
|
||||
see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
|
||||
drop_r_hand()
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
var/acceleration = 1
|
||||
var/owner_follows_eye = 0
|
||||
|
||||
see_in_dark = 7
|
||||
status_flags = GODMODE
|
||||
invisibility = INVISIBILITY_EYE
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
icon_state = "blob_spore_temp"
|
||||
pass_flags = PASSBLOB
|
||||
see_in_dark = 8
|
||||
see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
var/ghost_name = "Unknown"
|
||||
var/creating_blob = 0
|
||||
|
||||
@@ -48,5 +48,5 @@
|
||||
/mob/living/carbon/alien/show_inv(mob/user as mob)
|
||||
return //Consider adding cuffs and hats to this, for the sake of fun.
|
||||
|
||||
/mob/living/carbon/alien/can_use_vents()
|
||||
/mob/living/carbon/alien/cannot_use_vents()
|
||||
return
|
||||
@@ -95,13 +95,11 @@
|
||||
sight |= SEE_TURFS
|
||||
sight |= SEE_MOBS
|
||||
sight |= SEE_OBJS
|
||||
see_in_dark = 8
|
||||
see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
else if (stat != 2)
|
||||
sight &= ~SEE_TURFS
|
||||
sight &= ~SEE_MOBS
|
||||
sight &= ~SEE_OBJS
|
||||
see_in_dark = 2
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
if (healths)
|
||||
|
||||
@@ -195,6 +195,16 @@
|
||||
else
|
||||
healths.icon_state = "health7"
|
||||
|
||||
if (stat == 2 || (XRAY in src.mutations))
|
||||
sight |= SEE_TURFS
|
||||
sight |= SEE_MOBS
|
||||
sight |= SEE_OBJS
|
||||
see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
else if (stat != 2)
|
||||
sight &= ~SEE_TURFS
|
||||
sight &= ~SEE_MOBS
|
||||
sight &= ~SEE_OBJS
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
if (client)
|
||||
client.screen.Remove(global_hud.blurry,global_hud.druggy,global_hud.vimpaired)
|
||||
|
||||
@@ -242,4 +252,4 @@
|
||||
emp_damage += rand(10,20)
|
||||
if(3)
|
||||
emp_damage += rand(0,10)
|
||||
..()*/
|
||||
..()*/
|
||||
|
||||
@@ -267,8 +267,9 @@
|
||||
M.visible_message("<span class='notice'>[M] shakes [src] trying to wake [t_him] up!</span>", \
|
||||
"<span class='notice'>You shake [src] trying to wake [t_him] up!</span>")
|
||||
else
|
||||
if(istype(H))
|
||||
H.species.hug(H,src)
|
||||
var/mob/living/carbon/human/hugger = M
|
||||
if(istype(hugger))
|
||||
hugger.species.hug(hugger,src)
|
||||
else
|
||||
M.visible_message("<span class='notice'>[M] hugs [src] to make [t_him] feel better!</span>", \
|
||||
"<span class='notice'>You hug [src] to make [t_him] feel better!</span>")
|
||||
@@ -458,7 +459,7 @@
|
||||
if(istype(AM, /mob/living/carbon) && prob(10))
|
||||
src.spread_disease_to(AM, "Contact")
|
||||
|
||||
/mob/living/carbon/can_use_vents()
|
||||
/mob/living/carbon/cannot_use_vents()
|
||||
return
|
||||
|
||||
/mob/living/carbon/slip(var/slipped_on,stun_duration=8)
|
||||
|
||||
@@ -1226,7 +1226,6 @@
|
||||
|
||||
if(XRAY in mutations)
|
||||
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
|
||||
see_in_dark = 8
|
||||
if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
|
||||
if(seer==1)
|
||||
@@ -1237,6 +1236,8 @@
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
seer = 0
|
||||
|
||||
else
|
||||
sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS)
|
||||
var/tmp/glasses_processed = 0
|
||||
var/obj/item/weapon/rig/rig = back
|
||||
if(istype(rig) && rig.visor)
|
||||
@@ -1248,6 +1249,9 @@
|
||||
if(glasses && !glasses_processed)
|
||||
glasses_processed = 1
|
||||
process_glasses(glasses)
|
||||
if(XRAY in mutations)
|
||||
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
|
||||
if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
|
||||
if(!glasses_processed && (species.vision_flags > 0))
|
||||
sight |= species.vision_flags
|
||||
@@ -1684,6 +1688,7 @@
|
||||
holder.icon_state = "hudblank"
|
||||
if(mind)
|
||||
|
||||
// TODO: Update to new antagonist system.
|
||||
switch(mind.special_role)
|
||||
if("traitor","Mercenary")
|
||||
holder.icon_state = "hudsyndicate"
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
language = "Sol Common" //todo?
|
||||
unarmed_types = list(/datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/sharp)
|
||||
light_dam = 2
|
||||
darksight = 8
|
||||
has_organ = list()
|
||||
siemens_coefficient = 0
|
||||
|
||||
@@ -23,4 +22,4 @@
|
||||
/datum/species/shadow/handle_death(var/mob/living/carbon/human/H)
|
||||
spawn(1)
|
||||
new /obj/effect/decal/cleanable/ash(H.loc)
|
||||
qdel(H)
|
||||
qdel(H)
|
||||
|
||||
@@ -100,7 +100,6 @@
|
||||
var/list/inherent_verbs // Species-specific verbs.
|
||||
var/has_fine_manipulation = 1 // Can use small items.
|
||||
var/siemens_coefficient = 1 // The lower, the thicker the skin and better the insulation.
|
||||
var/darksight = 2 // Native darksight distance.
|
||||
var/flags = 0 // Various specific features.
|
||||
var/slowdown = 0 // Passive movement speed malus (or boost, if negative)
|
||||
var/primitive_form // Lesser form, if any (ie. monkey for humans)
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
unarmed_types = list(/datum/unarmed_attack/slime_glomp)
|
||||
flags = IS_RESTRICTED | NO_SCAN | NO_SLIP | NO_BREATHE
|
||||
siemens_coefficient = 3
|
||||
darksight = 3
|
||||
|
||||
blood_color = "#05FF9B"
|
||||
flesh_color = "#05FFFB"
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
tail_animation = 'icons/mob/species/unathi/tail.dmi'
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
|
||||
primitive_form = "Stok"
|
||||
darksight = 3
|
||||
gluttonous = 1
|
||||
|
||||
blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \
|
||||
@@ -73,7 +72,6 @@
|
||||
tail = "tajtail"
|
||||
tail_animation = 'icons/mob/species/tajaran/tail.dmi'
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
|
||||
darksight = 8
|
||||
slowdown = -1
|
||||
brute_mod = 1.2
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
update_icon = 0
|
||||
nutrition = 700
|
||||
|
||||
see_in_dark = 8
|
||||
update_slimes = 0
|
||||
|
||||
// canstun and canweaken don't affect slimes because they ignore stun and weakened variables
|
||||
@@ -399,7 +398,7 @@
|
||||
adjustToxLoss(-10)
|
||||
nutrition = max(nutrition, get_max_nutrition())
|
||||
|
||||
/mob/living/carbon/slime/can_use_vents()
|
||||
/mob/living/carbon/slime/cannot_use_vents()
|
||||
if(Victim)
|
||||
return "You cannot ventcrawl while feeding."
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -664,9 +664,9 @@ default behaviour is:
|
||||
src << "You can't vent crawl while you're stunned!"
|
||||
return
|
||||
|
||||
var/special_fail_msg = can_use_vents()
|
||||
var/special_fail_msg = cannot_use_vents()
|
||||
if(special_fail_msg)
|
||||
src << "\red [special_fail_msg]"
|
||||
src << "<span class='warning'>[special_fail_msg]</span>"
|
||||
return
|
||||
|
||||
if(vent_found) // one was passed in, probably from vent/AltClick()
|
||||
@@ -755,7 +755,7 @@ default behaviour is:
|
||||
if(new_area)
|
||||
new_area.Entered(src)
|
||||
|
||||
/mob/living/proc/can_use_vents()
|
||||
/mob/living/proc/cannot_use_vents()
|
||||
return "You can't fit into that vent."
|
||||
|
||||
/mob/living/proc/has_brain()
|
||||
|
||||
@@ -49,6 +49,7 @@ var/list/ai_verbs_default = list(
|
||||
var/list/network = list("Exodus")
|
||||
var/obj/machinery/camera/camera = null
|
||||
var/list/connected_robots = list()
|
||||
var/has_power = 0
|
||||
var/aiRestorePowerRoutine = 0
|
||||
var/viewalerts = 0
|
||||
var/icon/holo_icon//Default is assigned when AI is created.
|
||||
|
||||
@@ -38,19 +38,18 @@
|
||||
src << "<span class='notice'><b>APU GENERATOR FAILURE! (System Damaged)</b></span>"
|
||||
stop_apu(1)
|
||||
|
||||
var/blind = 0
|
||||
has_power = 1
|
||||
var/area/loc = null
|
||||
if (istype(T, /turf))
|
||||
loc = T.loc
|
||||
if (istype(loc, /area))
|
||||
if (!loc.power_equip && !istype(src.loc,/obj/item) && !APU_power)
|
||||
blind = 1
|
||||
has_power = 0
|
||||
|
||||
if (!blind)
|
||||
if (has_power)
|
||||
src.sight |= SEE_TURFS
|
||||
src.sight |= SEE_MOBS
|
||||
src.sight |= SEE_OBJS
|
||||
src.see_in_dark = 8
|
||||
src.see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
if (aiRestorePowerRoutine==2)
|
||||
@@ -80,12 +79,10 @@
|
||||
//Blind the AI
|
||||
updateicon()
|
||||
src.blind.screen_loc = "1,1 to 15,15"
|
||||
if (src.blind.layer!=18)
|
||||
src.blind.layer = 18
|
||||
|
||||
src.sight = src.sight&~SEE_TURFS
|
||||
src.sight = src.sight&~SEE_MOBS
|
||||
src.sight = src.sight&~SEE_OBJS
|
||||
src.see_in_dark = 0
|
||||
src.see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
//Now to tell the AI why they're blind and dying slowly.
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
lawsync()
|
||||
photosync()
|
||||
src << "<b>Laws synced with AI, be sure to note any changes.</b>"
|
||||
// TODO: Update to new antagonist system.
|
||||
if(mind && mind.special_role == "traitor" && mind.original == src)
|
||||
src << "<b>Remember, your AI does NOT share or know about your law 0."
|
||||
else
|
||||
@@ -28,6 +29,7 @@
|
||||
|
||||
who << "<b>Obey these laws:</b>"
|
||||
laws.show_laws(who)
|
||||
// TODO: Update to new antagonist system.
|
||||
if (mind && (mind.special_role == "traitor" && mind.original == src) && connected_ai)
|
||||
who << "<b>Remember, [connected_ai.name] is technically your master, but your objective comes first.</b>"
|
||||
else if (connected_ai)
|
||||
|
||||
@@ -163,13 +163,11 @@
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
else if (src.sight_mode & BORGTHERM)
|
||||
src.sight |= SEE_MOBS
|
||||
src.see_in_dark = 8
|
||||
src.see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
else if (src.stat != 2)
|
||||
src.sight &= ~SEE_MOBS
|
||||
src.sight &= ~SEE_TURFS
|
||||
src.sight &= ~SEE_OBJS
|
||||
src.see_in_dark = 8 // see_in_dark means you can FAINTLY see in the dark, humans have a range of 3 or so, tajaran have it at 8
|
||||
src.see_invisible = SEE_INVISIBLE_LIVING // This is normal vision (25), setting it lower for normal vision means you don't "see" things like darkness since darkness
|
||||
// has a "invisible" value of 15
|
||||
|
||||
@@ -225,10 +223,12 @@
|
||||
if (src.syndicate && src.client)
|
||||
for(var/datum/mind/tra in traitors.current_antagonists)
|
||||
if(tra.current)
|
||||
// TODO: Update to new antagonist system.
|
||||
var/I = image('icons/mob/mob.dmi', loc = tra.current, icon_state = "traitor")
|
||||
src.client.images += I
|
||||
src.disconnect_from_ai()
|
||||
if(src.mind)
|
||||
// TODO: Update to new antagonist system.
|
||||
if(!src.mind.special_role)
|
||||
src.mind.special_role = "traitor"
|
||||
traitors.current_antagonists |= src.mind
|
||||
|
||||
@@ -207,5 +207,5 @@
|
||||
your host and your eventual spawn safe and warm."
|
||||
src << "You can speak to your victim with <b>say</b>, to other borers with <b>say :x</b>, and use your Abilities tab to access powers."
|
||||
|
||||
/mob/living/simple_animal/borer/can_use_vents()
|
||||
/mob/living/simple_animal/borer/cannot_use_vents()
|
||||
return
|
||||
@@ -150,7 +150,6 @@
|
||||
attacktext = "slashed"
|
||||
speed = -1
|
||||
environment_smash = 1
|
||||
see_in_dark = 7
|
||||
attack_sound = 'sound/weapons/rapidslice.ogg'
|
||||
construct_spells = list(/spell/targeted/ethereal_jaunt/shift)
|
||||
|
||||
@@ -228,7 +227,6 @@
|
||||
attacktext = "violently stabbed"
|
||||
speed = -1
|
||||
environment_smash = 1
|
||||
see_in_dark = 7
|
||||
attack_sound = 'sound/weapons/pierce.ogg'
|
||||
|
||||
construct_spells = list(
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
emote_see = list("shakes their head", "shivers")
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
response_help = "pets"
|
||||
response_disarm = "bops"
|
||||
response_harm = "kicks"
|
||||
see_in_dark = 5
|
||||
mob_size = 8
|
||||
|
||||
var/obj/item/inventory_head
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
emote_see = list("shakes its head", "stamps a foot", "glares around")
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
meat_amount = 4
|
||||
response_help = "pets"
|
||||
@@ -95,7 +94,6 @@
|
||||
emote_see = list("shakes its head")
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
meat_amount = 6
|
||||
response_help = "pets"
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
small = 1
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
maxHealth = 5
|
||||
health = 5
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
|
||||
@@ -147,5 +146,5 @@
|
||||
// Change my name back, don't want to be named Tom (666)
|
||||
name = initial(name)
|
||||
|
||||
/mob/living/simple_animal/mouse/can_use_vents()
|
||||
/mob/living/simple_animal/mouse/cannot_use_vents()
|
||||
return
|
||||
|
||||
@@ -13,14 +13,14 @@
|
||||
var/obj/machinery/camera/camera = null
|
||||
var/obj/item/device/mmi/mmi = null
|
||||
var/list/req_access = list(access_robotics) //Access needed to pop out the brain.
|
||||
var/positronic
|
||||
|
||||
name = "Spider-bot"
|
||||
name = "spider-bot"
|
||||
desc = "A skittering robotic friend!"
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
icon_state = "spiderbot-chassis"
|
||||
icon_living = "spiderbot-chassis"
|
||||
icon_dead = "spiderbot-smashed"
|
||||
universal_speak = 1 //Temp until these are rewritten.
|
||||
|
||||
wander = 0
|
||||
|
||||
@@ -38,19 +38,26 @@
|
||||
var/emagged = 0
|
||||
var/obj/item/held_item = null //Storage for single item they can hold.
|
||||
speed = -1 //Spiderbots gotta go fast.
|
||||
//pass_flags = PASSTABLE //Maybe griefy?
|
||||
pass_flags = PASSTABLE
|
||||
small = 1
|
||||
speak_emote = list("beeps","clicks","chirps")
|
||||
|
||||
/mob/living/simple_animal/spiderbot/New()
|
||||
..()
|
||||
add_language("Galactic Common")
|
||||
default_language = all_languages["Galactic Common"]
|
||||
verbs |= /mob/living/proc/ventcrawl
|
||||
verbs |= /mob/living/proc/hide
|
||||
|
||||
/mob/living/simple_animal/spiderbot/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
|
||||
if(istype(O, /obj/item/device/mmi))
|
||||
var/obj/item/device/mmi/B = O
|
||||
if(src.mmi) //There's already a brain in it.
|
||||
user << "\red There's already a brain in [src]!"
|
||||
if(src.mmi)
|
||||
user << "<span class='warning'>There's already a brain in [src]!</span>"
|
||||
return
|
||||
if(!B.brainmob)
|
||||
user << "\red Sticking an empty MMI into the frame would sort of defeat the purpose."
|
||||
user << "<span class='warning'>Sticking an empty MMI into the frame would sort of defeat the purpose.</span>"
|
||||
return
|
||||
if(!B.brainmob.key)
|
||||
var/ghost_can_reenter = 0
|
||||
@@ -64,14 +71,18 @@
|
||||
return
|
||||
|
||||
if(B.brainmob.stat == DEAD)
|
||||
user << "\red [O] is dead. Sticking it into the frame would sort of defeat the purpose."
|
||||
user << "<span class='warning'>[O] is dead. Sticking it into the frame would sort of defeat the purpose.</span>"
|
||||
return
|
||||
|
||||
if(jobban_isbanned(B.brainmob, "Cyborg"))
|
||||
user << "\red [O] does not seem to fit."
|
||||
user << "<span class='warning'>\The [O] does not seem to fit.</span>"
|
||||
return
|
||||
|
||||
user << "\blue You install [O] in [src]!"
|
||||
user << "<span class='notice'>You install \the [O] in \the [src]!</span>"
|
||||
|
||||
if(istype(O, /obj/item/device/mmi/digital))
|
||||
positronic = 1
|
||||
add_language("Robot Talk")
|
||||
|
||||
user.drop_item()
|
||||
src.mmi = O
|
||||
@@ -89,16 +100,15 @@
|
||||
if(health > maxHealth)
|
||||
health = maxHealth
|
||||
add_fingerprint(user)
|
||||
for(var/mob/W in viewers(user, null))
|
||||
W.show_message(text("\red [user] has spot-welded some of the damage to [src]!"), 1)
|
||||
src.visible_message("<span class='notice'>\The [user] has spot-welded some of the damage to \the [src]!</span>")
|
||||
else
|
||||
user << "\blue [src] is undamaged!"
|
||||
user << "<span class='warning'>\The [src] is undamaged!</span>"
|
||||
else
|
||||
user << "Need more welding fuel!"
|
||||
user << "<span class='danger'>You need more welding fuel for this task!</span>"
|
||||
return
|
||||
else if(istype(O, /obj/item/weapon/card/id)||istype(O, /obj/item/device/pda))
|
||||
if (!mmi)
|
||||
user << "\red There's no reason to swipe your ID - the spiderbot has no brain to remove."
|
||||
user << "<span class='danger'>There's no reason to swipe your ID - \the [src] has no brain to remove.</span>"
|
||||
return 0
|
||||
|
||||
var/obj/item/weapon/card/id/id_card
|
||||
@@ -110,16 +120,14 @@
|
||||
id_card = pda.id
|
||||
|
||||
if(access_robotics in id_card.access)
|
||||
user << "\blue You swipe your access card and pop the brain out of [src]."
|
||||
user << "<span class='notice'>You swipe your access card and pop the brain out of \the [src].</span>"
|
||||
eject_brain()
|
||||
|
||||
if(held_item)
|
||||
held_item.loc = src.loc
|
||||
held_item = null
|
||||
|
||||
return 1
|
||||
else
|
||||
user << "\red You swipe your card, with no effect."
|
||||
user << "<span class='danger'>You swipe your card with no effect.</span>"
|
||||
return 0
|
||||
|
||||
else
|
||||
@@ -140,23 +148,22 @@
|
||||
src.mind = M.brainmob.mind
|
||||
src.mind.key = M.brainmob.key
|
||||
src.ckey = M.brainmob.ckey
|
||||
src.name = "Spider-bot ([M.brainmob.name])"
|
||||
src.name = "spider-bot ([M.brainmob.name])"
|
||||
|
||||
/mob/living/simple_animal/spiderbot/proc/explode() //When emagged.
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red [src] makes an odd warbling noise, fizzles, and explodes.")
|
||||
src.visible_message("<span class='danger'>\The [src] makes an odd warbling noise, fizzles, and explodes!</span>")
|
||||
explosion(get_turf(loc), -1, -1, 3, 5)
|
||||
eject_brain()
|
||||
death()
|
||||
|
||||
/mob/living/simple_animal/spiderbot/proc/update_icon()
|
||||
if(istype(mmi, /obj/item/device/mmi/digital/posibrain))
|
||||
icon_state = "spiderbot-chassis-posi"
|
||||
icon_living = "spiderbot-chassis-posi"
|
||||
else if(istype(mmi,/obj/item/device/mmi))
|
||||
icon_state = "spiderbot-chassis-mmi"
|
||||
icon_living = "spiderbot-chassis-mmi"
|
||||
if(mmi)
|
||||
if(positronic)
|
||||
icon_state = "spiderbot-chassis-posi"
|
||||
icon_living = "spiderbot-chassis-posi"
|
||||
else
|
||||
icon_state = "spiderbot-chassis-mmi"
|
||||
icon_living = "spiderbot-chassis-mmi"
|
||||
else
|
||||
icon_state = "spiderbot-chassis"
|
||||
icon_living = "spiderbot-chassis"
|
||||
@@ -168,8 +175,11 @@
|
||||
mmi.loc = T
|
||||
if(mind) mind.transfer_to(mmi.brainmob)
|
||||
mmi = null
|
||||
src.name = "Spider-bot"
|
||||
real_name = initial(real_name)
|
||||
name = real_name
|
||||
update_icon()
|
||||
remove_language("Robot Talk")
|
||||
positronic = null
|
||||
|
||||
/mob/living/simple_animal/spiderbot/Destroy()
|
||||
eject_brain()
|
||||
@@ -179,7 +189,7 @@
|
||||
|
||||
radio = new /obj/item/device/radio/borg(src)
|
||||
camera = new /obj/machinery/camera(src)
|
||||
camera.c_tag = "Spiderbot-[real_name]"
|
||||
camera.c_tag = "spiderbot-[real_name]"
|
||||
camera.replace_networks(list("SS13"))
|
||||
|
||||
..()
|
||||
@@ -213,14 +223,18 @@
|
||||
return 0
|
||||
|
||||
if(istype(held_item, /obj/item/weapon/grenade))
|
||||
visible_message("\red [src] launches \the [held_item]!", "\red You launch \the [held_item]!", "You hear a skittering noise and a thump!")
|
||||
visible_message("<span class='danger'>\The [src] launches \the [held_item]!</span>", \
|
||||
"<span class='danger'>You launch \the [held_item]!</span>", \
|
||||
"You hear a skittering noise and a thump!")
|
||||
var/obj/item/weapon/grenade/G = held_item
|
||||
G.loc = src.loc
|
||||
G.prime()
|
||||
held_item = null
|
||||
return 1
|
||||
|
||||
visible_message("\blue [src] drops \the [held_item]!", "\blue You drop \the [held_item]!", "You hear a skittering noise and a soft thump.")
|
||||
visible_message("<span class='notice'>\The [src] drops \the [held_item].</span>", \
|
||||
"<span class='notice'>You drop \the [held_item].</span>", \
|
||||
"You hear a skittering noise and a soft thump.")
|
||||
|
||||
held_item.loc = src.loc
|
||||
held_item = null
|
||||
@@ -237,7 +251,7 @@
|
||||
return -1
|
||||
|
||||
if(held_item)
|
||||
src << "\red You are already holding \the [held_item]"
|
||||
src << "<span class='warning'>You are already holding \the [held_item]</span>"
|
||||
return 1
|
||||
|
||||
var/list/items = list()
|
||||
@@ -252,15 +266,23 @@
|
||||
if(selection == I)
|
||||
held_item = selection
|
||||
selection.loc = src
|
||||
visible_message("\blue [src] scoops up \the [held_item]!", "\blue You grab \the [held_item]!", "You hear a skittering noise and a clink.")
|
||||
visible_message("<span class='notice'>\The [src] scoops up \the [held_item].</span>", \
|
||||
"<span class='notice'>You grab \the [held_item].</span>", \
|
||||
"You hear a skittering noise and a clink.")
|
||||
return held_item
|
||||
src << "\red \The [selection] is too far away."
|
||||
src << "<span class='warning'>\The [selection] is too far away.</span>"
|
||||
return 0
|
||||
|
||||
src << "\red There is nothing of interest to take."
|
||||
src << "<span class='warning'>There is nothing of interest to take.</span>"
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/spiderbot/examine(mob/user)
|
||||
..(user)
|
||||
if(src.held_item)
|
||||
user << "It is carrying \a [src.held_item] \icon[src.held_item]."
|
||||
user << "It is carrying \icon[src.held_item] \a [src.held_item]."
|
||||
|
||||
/mob/living/simple_animal/spiderbot/cannot_use_vents()
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/spiderbot/binarycheck()
|
||||
return positronic
|
||||
@@ -12,7 +12,6 @@
|
||||
emote_see = list("stares ferociously", "stomps")
|
||||
speak_chance = 1
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
emote_hear = list("chitters")
|
||||
speak_chance = 5
|
||||
turns_per_move = 5
|
||||
see_in_dark = 10
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
@@ -213,4 +212,4 @@
|
||||
#undef SPINNING_WEB
|
||||
#undef LAYING_EGGS
|
||||
#undef MOVING_TO_TARGET
|
||||
#undef SPINNING_COCOON
|
||||
#undef SPINNING_COCOON
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
emote_see = list("looks around suspiciously.", "scratches it's arm.","putters around a bit.")
|
||||
speak_chance = 15
|
||||
turns_per_move = 5
|
||||
see_in_dark = 6
|
||||
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey
|
||||
response_help = "pets"
|
||||
response_disarm = "gently pushes aside"
|
||||
|
||||
@@ -102,6 +102,7 @@
|
||||
handle_stunned()
|
||||
handle_weakened()
|
||||
handle_paralysed()
|
||||
update_canmove()
|
||||
handle_supernatural()
|
||||
|
||||
//Movement
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
density = 1
|
||||
layer = 4.0
|
||||
animate_movement = 2
|
||||
see_in_dark = 0
|
||||
// flags = NOREACT
|
||||
var/datum/mind/mind
|
||||
|
||||
|
||||
@@ -44,13 +44,12 @@
|
||||
|
||||
return all_alarms
|
||||
|
||||
/datum/nano_module/alarm_monitor/ai/Topic(ref, href_list)
|
||||
/datum/nano_module/alarm_monitor/Topic(ref, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
if(href_list["switchTo"])
|
||||
var/obj/machinery/camera/C = locate(href_list["switchTo"]) in cameranet.cameras
|
||||
if(!C)
|
||||
|
||||
return
|
||||
|
||||
usr.switch_to_camera(C)
|
||||
|
||||
@@ -1570,10 +1570,10 @@
|
||||
required_reagents = list("rum" = 2, "cola" = 1)
|
||||
result_amount = 3
|
||||
|
||||
/datum/chemical_reaction/classicmartini
|
||||
/datum/chemical_reaction/martini
|
||||
name = "Classic Martini"
|
||||
id = "classicmartini"
|
||||
result = "classicmartini"
|
||||
id = "martini"
|
||||
result = "martini"
|
||||
required_reagents = list("gin" = 2, "vermouth" = 1)
|
||||
result_amount = 3
|
||||
|
||||
|
||||
@@ -189,7 +189,11 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
|
||||
if(silenced > 0)
|
||||
return
|
||||
|
||||
if(user.z == 2 && spell_flags & Z2NOCAST) //Certain spells are not allowed on the centcomm zlevel
|
||||
var/turf/Turf = get_turf(user)
|
||||
if(!Turf)
|
||||
user << "<span class='warning'>You cannot cast spells in null space!</span>"
|
||||
|
||||
if(spell_flags & Z2NOCAST && (Turf.z in config.admin_levels)) //Certain spells are not allowed on the centcomm zlevel
|
||||
return 0
|
||||
|
||||
if(spell_flags & CONSTRUCT_CHECK)
|
||||
|
||||
@@ -256,7 +256,6 @@
|
||||
if (!(XRAY in H.mutations))
|
||||
H.mutations.Add(XRAY)
|
||||
H.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
|
||||
H.see_in_dark = 8
|
||||
H.see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
H << "\blue The walls suddenly disappear."
|
||||
temp = "You have purchased a scrying orb, and gained x-ray vision."
|
||||
@@ -288,6 +287,7 @@
|
||||
for(var/spell/knownspell in user.spell_list)
|
||||
if(knownspell.type == S.type)
|
||||
if(user.mind)
|
||||
// TODO: Update to new antagonist system.
|
||||
if(user.mind.special_role == "apprentice" || user.mind.special_role == "Wizard")
|
||||
user <<"<span class='notice'>You're already far more versed in this spell than this flimsy how-to book can provide.</span>"
|
||||
else
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
target.transforming=0 //mob is safely inside holder now, no need for protection.
|
||||
jaunt_steam(mobloc)
|
||||
sleep(duration)
|
||||
mobloc = get_turf(target.loc)
|
||||
mobloc = holder.last_valid_turf
|
||||
animation.loc = mobloc
|
||||
jaunt_steam(mobloc)
|
||||
target.canmove = 0
|
||||
@@ -75,6 +75,11 @@
|
||||
var/reappearing = 0
|
||||
density = 0
|
||||
anchored = 1
|
||||
var/turf/last_valid_turf
|
||||
|
||||
/obj/effect/dummy/spell_jaunt/New(var/location)
|
||||
..()
|
||||
last_valid_turf = get_turf(location)
|
||||
|
||||
/obj/effect/dummy/spell_jaunt/Destroy()
|
||||
// Eject contents if deleted somehow
|
||||
@@ -87,6 +92,9 @@
|
||||
var/turf/newLoc = get_step(src,direction)
|
||||
if(!(newLoc.flags & NOJAUNT))
|
||||
loc = newLoc
|
||||
var/turf/T = get_turf(loc)
|
||||
if(!T.contains_dense_objects())
|
||||
last_valid_turf = T
|
||||
else
|
||||
user << "<span class='warning'>Some strange aura is blocking the way!</span>"
|
||||
src.canmove = 0
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
cooldown_min = 200 //100 deciseconds reduction per rank
|
||||
compatible_mobs = list(/mob/living/carbon/human) //which types of mobs are affected by the spell. NOTE: change at your own risk
|
||||
|
||||
// TODO: Update to new antagonist system.
|
||||
var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell
|
||||
var/msg_wait = 500 //how long in deciseconds it waits before telling that body doesn't feel right or mind swap robbed of a spell
|
||||
amt_paralysis = 20 //how much the victim is paralysed for after the spell
|
||||
|
||||
Reference in New Issue
Block a user