Merge branch 'master' of https://github.com/VOREStation/Polaris into aro-sync-05-25-2018

# Conflicts:
#	code/__defines/misc.dm
#	code/controllers/master_controller.dm
#	code/game/machinery/computer3/computers/card.dm
#	code/game/objects/items/devices/communicator/UI.dm
#	code/game/objects/items/stacks/medical.dm
#	code/game/objects/structures/signs.dm
#	code/modules/admin/admin_verbs.dm
#	code/modules/client/client defines.dm
#	code/modules/client/client procs.dm
#	code/modules/clothing/clothing.dm
#	code/modules/clothing/under/accessories/holster.dm
#	code/modules/events/radiation_storm.dm
#	code/modules/mining/machine_processing.dm
#	code/modules/mob/living/carbon/human/species/station/prometheans.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob/living/simple_animal/animals/bear.dm
#	code/modules/mob/living/simple_animal/animals/cat.dm
#	code/modules/mob/living/simple_animal/animals/parrot.dm
#	code/modules/mob/mob.dm
#	code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
#	code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
#	code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
#	code/modules/reagents/reagent_dispenser.dm
#	config/example/config.txt
#	html/changelogs/.all_changelog.yml
#	interface/skin.dmf
#	maps/southern_cross/southern_cross-1.dmm
#	vorestation.dme
This commit is contained in:
Arokha Sieyes
2018-05-25 13:23:47 -04:00
291 changed files with 324089 additions and 16301 deletions
+1 -1
View File
@@ -800,7 +800,7 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
set name = "Blank pAI alert"
set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope."
if(usr.client.prefs.be_special & BE_PAI)
for(var/obj/item/device/paicard/p in world)
for(var/obj/item/device/paicard/p in all_pai_cards)
var/obj/item/device/paicard/PP = p
if(PP.pai == null)
PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit
+1 -1
View File
@@ -302,7 +302,7 @@
else adverb = " a very lengthy message"
message = "<B>[speaker]</B> [verb][adverb]."
src.show_message(message)
show_message(message, type = 1) // Type 1 is visual message
/mob/proc/hear_sleep(var/message)
var/heard = ""
+3
View File
@@ -383,3 +383,6 @@
else return !D.check_access(ID) // it's a real, air blocking door
return 0
/mob/living/bot/isSynthetic() //Robots are synthetic, no?
return 1
+4
View File
@@ -267,6 +267,10 @@
/mob/living/carbon/proc/eyecheck()
return 0
/mob/living/carbon/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash)
if(eyecheck() < intensity || override_blindness_check)
return ..()
// ++++ROCKDTBEN++++ MOB PROCS -- Ask me before touching.
// Stop! ... Hammertime! ~Carn
@@ -128,7 +128,7 @@
var/tie_msg
if(istype(w_uniform,/obj/item/clothing/under) && !(skip_gear & EXAMINE_SKIPTIE))
var/obj/item/clothing/under/U = w_uniform
if(U.accessories.len)
if(LAZYLEN(U.accessories))
var/list/accessories_visible = list() //please let this fix the stupid fucking runtimes
if(skip_gear & EXAMINE_SKIPHOLSTER)
for(var/obj/item/clothing/accessory/A in U.accessories)
@@ -145,7 +145,7 @@
if(w_uniform.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [w_uniform.name]![tie_msg]</span><br>"
else
msg += "[T.He] [T.is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].<br>"
msg += "[T.He] [T.is] wearing \icon[w_uniform] \a [w_uniform].[tie_msg]<br>"
//head
if(head && !(skip_gear & EXAMINE_SKIPHELMET) && head.show_examine)
@@ -159,7 +159,7 @@
var/tie_msg
if(istype(wear_suit,/obj/item/clothing/suit))
var/obj/item/clothing/suit/U = wear_suit
if(U.accessories.len)
if(LAZYLEN(U.accessories))
tie_msg += " Attached to it is [english_list(U.accessories)]."
if(wear_suit.blood_DNA)
+14 -7
View File
@@ -667,14 +667,21 @@
I = internal_organs_by_name[O_EYES]
if(I.is_broken())
return FLASH_PROTECTION_MAJOR
else // They can't be flashed if they don't have eyes.
else if(!species.dispersed_eyes) // They can't be flashed if they don't have eyes, or widespread sensing surfaces.
return FLASH_PROTECTION_MAJOR
var/number = get_equipment_flash_protection()
number = I.get_total_protection(number)
I.additional_flash_effects(number)
if(I)
number = I.get_total_protection(number)
I.additional_flash_effects(number)
return number
/mob/living/carbon/human/flash_eyes(var/intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash)
if(internal_organs_by_name[O_EYES]) // Eyes are fucked, not a 'weak point'.
var/obj/item/organ/internal/eyes/I = internal_organs_by_name[O_EYES]
I.additional_flash_effects(intensity)
return ..()
#define add_clothing_protection(A) \
var/obj/item/clothing/C = A; \
flash_protection += C.flash_protection; \
@@ -853,7 +860,7 @@
src.verbs -= /mob/living/carbon/human/proc/remotesay
return
var/list/creatures = list()
for(var/mob/living/carbon/h in world)
for(var/mob/living/carbon/h in mob_list)
creatures += h
var/mob/target = input("Who do you want to project your mind to ?") as null|anything in creatures
if (isnull(target))
@@ -866,7 +873,7 @@
target.show_message("<font color='blue'> You hear a voice that seems to echo around the room: [say]</font>")
usr.show_message("<font color='blue'> You project your mind into [target.real_name]: [say]</font>")
log_say("(TPATH to [key_name(target)]) [say]",src)
for(var/mob/observer/dead/G in world)
for(var/mob/observer/dead/G in mob_list)
G.show_message("<i>Telepathic message from <b>[src]</b> to <b>[target]</b>: [say]</i>")
/mob/living/carbon/human/proc/remoteobserve()
@@ -891,7 +898,7 @@
var/list/mob/creatures = list()
for(var/mob/living/carbon/h in world)
for(var/mob/living/carbon/h in mob_list)
var/turf/temp_turf = get_turf(h)
if((temp_turf.z != 1 && temp_turf.z != 5) || h.stat!=CONSCIOUS) //Not on mining or the station. Or dead
continue
@@ -930,7 +937,7 @@
restore_all_organs() // Reapply robotics/amputated status from preferences.
if(!client || !key) //Don't boot out anyone already in the mob.
for (var/obj/item/organ/internal/brain/H in world)
for (var/obj/item/organ/internal/brain/H in all_brain_organs)
if(H.brainmob)
if(H.brainmob.real_name == src.real_name)
if(H.brainmob.mind)
@@ -152,7 +152,7 @@ emp_act
for(var/obj/item/clothing/gear in protective_gear)
if(gear.body_parts_covered & def_zone.body_part)
protection += gear.armor[type]
if(gear.accessories.len)
if(LAZYLEN(gear.accessories))
for(var/obj/item/clothing/accessory/bling in gear.accessories)
if(bling.body_parts_covered & def_zone.body_part)
protection += bling.armor[type]
@@ -165,7 +165,7 @@ emp_act
for(var/obj/item/clothing/gear in protective_gear)
if(gear.body_parts_covered & def_zone.body_part)
soaked += gear.armorsoak[type]
if(gear.accessories.len)
if(LAZYLEN(gear.accessories))
for(var/obj/item/clothing/accessory/bling in gear.accessories)
if(bling.body_parts_covered & def_zone.body_part)
soaked += bling.armorsoak[type]
@@ -115,6 +115,11 @@
tally += item_tally
if(CE_SLOWDOWN in chem_effects)
if (tally >= 0 )
tally = (tally + tally/4) //Add a quarter of penalties on top.
tally += 1
if(CE_SPEEDBOOST in chem_effects)
if (tally >= 0) // cut any penalties in half
tally = tally/2
@@ -340,6 +340,11 @@ This saves us from having to call add_fingerprint() any time something is put in
if(W.action_button_name)
update_action_buttons()
if(W.zoom)
W.zoom()
W.in_inactive_hand(src)
return 1
//Checks if a given slot can be accessed at this time, either to equip or unequip I
@@ -75,13 +75,14 @@
/datum/unarmed_attack/bite
)
var/list/unarmed_attacks = null // For empty hand harm-intent attack
var/brute_mod = 1 // Physical damage multiplier.
var/burn_mod = 1 // Burn damage multiplier.
var/oxy_mod = 1 // Oxyloss modifier
var/toxins_mod = 1 // Toxloss modifier
var/radiation_mod = 1 // Radiation modifier
var/flash_mod = 1 // Stun from blindness modifier.
var/chemOD_mod = 1 // Damage modifier for overdose
var/brute_mod = 1 // Physical damage multiplier.
var/burn_mod = 1 // Burn damage multiplier.
var/oxy_mod = 1 // Oxyloss modifier
var/toxins_mod = 1 // Toxloss modifier
var/radiation_mod = 1 // Radiation modifier
var/flash_mod = 1 // Stun from blindness modifier.
var/sound_mod = 1 // Stun from sounds, I.E. flashbangs.
var/chemOD_mod = 1 // Damage modifier for overdose
var/vision_flags = SEE_SELF // Same flags as glasses.
// Death vars.
@@ -189,6 +190,7 @@
O_EYES = /obj/item/organ/internal/eyes
)
var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them.
var/dispersed_eyes // If set, the species will be affected by flashbangs regardless if they have eyes or not, as they see in large areas.
var/list/has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
@@ -5,7 +5,11 @@ var/datum/species/shapeshifter/promethean/prometheans
name = SPECIES_PROMETHEAN
name_plural = "Prometheans"
blurb = "What has Science done?"
blurb = "Prometheans (Macrolimus artificialis) are a species of artificially-created gelatinous humanoids, \
chiefly characterized by their primarily liquid bodies and ability to change their bodily shape and color in order to \
mimic many forms of life. Derived from the Aetolian giant slime (Macrolimus vulgaris) inhabiting the warm, tropical planet \
of Aetolus, they are a relatively new lab-created sapient species, and as such many things about them have yet to be comprehensively studied. \
What has Science done?"
show_ssd = "totally quiescent"
death_message = "rapidly loses cohesion, splattering across the ground..."
knockout_message = "collapses inwards, forming a disordered puddle of goo."
@@ -46,6 +50,8 @@ var/datum/species/shapeshifter/promethean/prometheans
brute_mod = 0.75
burn_mod = 2
oxy_mod = 0
flash_mod = 0.5 //No centralized, lensed eyes.
item_slowdown_mod = 1.33
cloning_modifier = /datum/modifier/cloning_sickness/promethean
@@ -66,6 +72,9 @@ var/datum/species/shapeshifter/promethean/prometheans
unarmed_types = list(/datum/unarmed_attack/slime_glomp)
has_organ = list(O_BRAIN = /obj/item/organ/internal/brain/slime) // Slime core.
dispersed_eyes = TRUE
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest/unbreakable/slime),
BP_GROIN = list("path" = /obj/item/organ/external/groin/unbreakable/slime),
@@ -147,25 +156,41 @@ var/datum/species/shapeshifter/promethean/prometheans
var/turf/T = H.loc
if(istype(T))
var/obj/effect/decal/cleanable/C = locate() in T
if(C)
if(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)))
return
if(C && !(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET))))
qdel(C)
if (istype(T, /turf/simulated))
var/turf/simulated/S = T
S.dirt = 0
H.nutrition += rand(15, 45)
H.nutrition = min(500, max(0, H.nutrition + rand(15, 30)))
VOREStation Removal End */
// Heal remaining damage.
if(H.fire_stacks >= 0)
if(H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss())
H.adjustBruteLoss(-heal_rate)
H.adjustFireLoss(-heal_rate)
H.adjustOxyLoss(-heal_rate)
H.adjustToxLoss(-heal_rate)
/* else //VOREStation Edit Start.
H.adjustToxLoss(2*heal_rate) // Doubled because 0.5 is miniscule, and fire_stacks are capped in both directions
*/ //VOREStation Edit End
var/nutrition_cost = 0
var/nutrition_debt = H.getBruteLoss()
var/starve_mod = 1
if(H.nutrition <= 25)
starve_mod = 0.75
H.adjustBruteLoss(-heal_rate * starve_mod)
nutrition_cost += nutrition_debt - H.getBruteLoss()
nutrition_debt = H.getFireLoss()
H.adjustFireLoss(-heal_rate * starve_mod)
nutrition_cost += nutrition_debt - H.getFireLoss()
nutrition_debt = H.getOxyLoss()
H.adjustOxyLoss(-heal_rate * starve_mod)
nutrition_cost += nutrition_debt - H.getOxyLoss()
nutrition_debt = H.getToxLoss()
H.adjustToxLoss(-heal_rate * starve_mod)
nutrition_cost += nutrition_debt - H.getToxLoss()
H.nutrition -= (2 * nutrition_cost) //Costs Nutrition when damage is being repaired, corresponding to the amount of damage being repaired.
H.nutrition = max(0, H.nutrition) //Ensure it's not below 0.
//else//VOREStation Removal
//H.adjustToxLoss(2*heal_rate) // Doubled because 0.5 is miniscule, and fire_stacks are capped in both directions
/datum/species/shapeshifter/promethean/get_blood_colour(var/mob/living/carbon/human/H)
return (H ? rgb(H.r_skin, H.g_skin, H.b_skin) : ..())
+21
View File
@@ -911,6 +911,15 @@ default behaviour is:
to_chat(src, "<span class='notice'>You are now [resting ? "resting" : "getting up"]</span>")
update_canmove()
//called when the mob receives a bright flash
/mob/living/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash)
if(override_blindness_check || !(disabilities & BLIND))
overlay_fullscreen("flash", type)
spawn(25)
if(src)
clear_fullscreen("flash", 25)
return 1
/mob/living/proc/cannot_use_vents()
if(mob_size > MOB_SMALL)
return "You can't fit into that vent."
@@ -1072,6 +1081,7 @@ default behaviour is:
unbuckle_mob(L)
L.Stun(5)
//VOREStation Add End
return canmove
// Adds overlays for specific modifiers.
@@ -1163,6 +1173,13 @@ default behaviour is:
else
hud_used.l_hand_hud_object.icon_state = "l_hand_inactive"
hud_used.r_hand_hud_object.icon_state = "r_hand_active"
// We just swapped hands, so the thing in our inactive hand will notice it's not the focus
var/obj/item/I = get_inactive_hand()
if(I)
if(I.zoom)
I.zoom()
I.in_inactive_hand(src) //This'll do specific things, determined by the item
return
/mob/living/proc/activate_hand(var/selhand) //0 or "r" or "right" for right hand; 1 or "l" or "left" for left hand.
@@ -1257,3 +1274,7 @@ default behaviour is:
/mob/living/proc/make_hud_overlays()
return
/mob/living/proc/has_vision()
return !(eye_blind || (disabilities & BLIND) || stat || blinded)
+17 -9
View File
@@ -265,14 +265,14 @@ proc/get_radio_key_from_channel(var/channel)
//Handle nonverbal and sign languages here
if (speaking)
if (speaking.flags & NONVERBAL)
if (prob(30))
src.custom_emote(1, "[pick(speaking.signlang_verb)].")
if (speaking.flags & SIGNLANG)
log_say("(SIGN) [message]", src)
return say_signlang(message, pick(speaking.signlang_verb), speaking)
if (speaking.flags & NONVERBAL)
if (prob(30))
src.custom_emote(1, "[pick(speaking.signlang_verb)].")
//These will contain the main receivers of the message
var/list/listening = list()
var/list/listening_obj = list()
@@ -374,11 +374,19 @@ proc/get_radio_key_from_channel(var/channel)
return 1
/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language)
var/list/potentials = get_mobs_and_objs_in_view_fast(src, world.view)
var/list/mobs = potentials["mobs"]
for(var/hearer in mobs)
var/mob/M = hearer
M.hear_signlang(message, verb, language, src)
var/turf/T = get_turf(src)
//We're in something, gesture to people inside the same thing
if(loc != T)
for(var/mob/M in loc)
M.hear_signlang(message, verb, language, src)
//We're on a turf, gesture to visible as if we were a normal language
else
var/list/potentials = get_mobs_and_objs_in_view_fast(T, world.view)
var/list/mobs = potentials["mobs"]
for(var/hearer in mobs)
var/mob/M = hearer
M.hear_signlang(message, verb, language, src)
return 1
/obj/effect/speech_bubble
+1 -1
View File
@@ -8,7 +8,7 @@
remove_ai_verbs(src)
for(var/obj/machinery/ai_status_display/O in world)
for(var/obj/machinery/ai_status_display/O in machines)
spawn( 0 )
O.mode = 2
if (istype(loc, /obj/item/device/aicard))
+1 -1
View File
@@ -1,6 +1,6 @@
/mob/living/silicon/ai/Logout()
..()
for(var/obj/machinery/ai_status_display/O in world) //change status
for(var/obj/machinery/ai_status_display/O in machines) //change status
O.mode = 0
if(!isturf(loc))
if (client)
@@ -3,6 +3,6 @@
icon_state = "ai-crash"
spawn(10)
explosion(loc, 3, 6, 12, 15)
for(var/obj/machinery/ai_status_display/O in world) //change status
for(var/obj/machinery/ai_status_display/O in machines) //change status
O.mode = 2
return ..(gibbed)
@@ -87,7 +87,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
if("submit")
if(candidate)
candidate.ready = 1
for(var/obj/item/device/paicard/p in world)
for(var/obj/item/device/paicard/p in all_pai_cards)
if(p.looking_for_personality == 1)
p.alertUpdate()
usr << browse(null, "window=paiRecruit")
@@ -186,9 +186,8 @@ var/list/mob_hat_cache = list()
user.visible_message("<span class='danger'>\The [user] swipes [TU.his] ID card through \the [src], attempting to reboot it.</span>", "<span class='danger'>>You swipe your ID card through \the [src], attempting to reboot it.</span>")
var/drones = 0
for(var/mob/living/silicon/robot/drone/D in world)
if(D.key && D.client)
drones++
for(var/mob/living/silicon/robot/drone/D in player_list)
drones++
if(drones < config.max_maint_drones)
request_player()
return
@@ -26,7 +26,7 @@
var/dat
dat += "<B>Maintenance Units</B><BR>"
for(var/mob/living/silicon/robot/drone/D in world)
for(var/mob/living/silicon/robot/drone/D in mob_list)
if(D.z != src.z)
continue
dat += "<BR>[D.real_name] ([D.stat == 2 ? "<font color='red'>INACTIVE</FONT>" : "<font color='green'>ACTIVE</FONT>"])"
@@ -68,8 +68,8 @@
else if (href_list["ping"])
usr << "<span class='notice'>You issue a maintenance request for all active drones, highlighting [drone_call_area].</span>"
for(var/mob/living/silicon/robot/drone/D in world)
if(D.client && D.stat == 0)
for(var/mob/living/silicon/robot/drone/D in player_list)
if(D.stat == 0)
D << "-- Maintenance drone presence requested in: [drone_call_area]."
else if (href_list["resync"])
@@ -1,8 +1,7 @@
/proc/count_drones()
var/drones = 0
for(var/mob/living/silicon/robot/drone/D in world)
if(D.key && D.client)
drones++
for(var/mob/living/silicon/robot/drone/D in player_list)
drones++
return drones
/obj/machinery/drone_fabricator
@@ -135,7 +134,7 @@
return
var/list/all_fabricators = list()
for(var/obj/machinery/drone_fabricator/DF in world)
for(var/obj/machinery/drone_fabricator/DF in machines)
if(DF.stat & NOPOWER || !DF.produce_drones)
continue
if(DF.drone_progress >= 100)
@@ -419,3 +419,6 @@
ghostize(0)
qdel(src)
/mob/living/silicon/has_vision()
return 0 //NOT REAL EYES
@@ -0,0 +1,431 @@
// A mob which only moves when it isn't being watched by living beings.
//Weeping angels/SCP-173 hype
//Horrible shitcoding and stolen code adaptations below. You have been warned.
/mob/living/simple_animal/hostile/statue
name = "statue" // matches the name of the statue with the flesh-to-stone spell
desc = "An incredibly lifelike marble carving. Its eyes seems to follow you..." // same as an ordinary statue with the added "eye following you" description
icon = 'icons/obj/statue.dmi'
tt_desc = "angelum weepicus"
icon_state = "human_male"
icon_living = "human_male"
icon_dead = "human_male"
intelligence_level = SA_HUMANOID
stop_automated_movement = 1
var/annoyance = 30 //stop staring you creep
var/respond = 1
var/banishable = 0
faction = "statue"
mob_size = MOB_HUGE
response_help = "touches"
response_disarm = "pushes"
environment_smash = 2
can_be_antagged = 1
speed = -1
maxHealth = 50000
health = 50000
status_flags = CANPUSH
// investigates = 1
a_intent = I_HURT
density = 1
mob_bump_flag = HEAVY
mob_push_flags = ~HEAVY
mob_swap_flags = ~HEAVY
harm_intent_damage = 60
melee_damage_lower = 50
melee_damage_upper = 70
attacktext = "clawed"
attack_sound = 'sound/hallucinations/growl1.ogg'
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = 9000
run_at_them = 0
move_to_delay = 0 // Very fast
animate_movement = NO_STEPS // Do not animate movement, you jump around as you're a scary statue.
see_in_dark = 13
view_range = 35 //So it can run at the victim when out of the view
melee_miss_chance = 0
see_invisible = SEE_INVISIBLE_NOLIGHTING
sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS
var/last_hit = 0
var/cannot_be_seen = 1
var/mob/living/creator = null
// No movement while seen code.
/mob/living/simple_animal/hostile/statue/New(loc)
..()
// Give spells
add_spell(new/spell/aoe_turf/flicker_lights)
add_spell(new/spell/aoe_turf/blindness)
add_spell(new/spell/aoe_turf/shatter)
/mob/living/simple_animal/hostile/statue/DestroySurroundings()
if(can_be_seen(get_turf(loc)))
if(client)
to_chat(src, "<span class='warning'>You cannot move, there are eyes on you!</span>")
return 0
return ..()
/mob/living/simple_animal/hostile/statue/attackby(var/obj/item/O as obj, var/mob/user as mob) //banishing the statue is a risky job
if(istype(O, /obj/item/weapon/nullrod))
visible_message("<span class='warning'>[user] tries to banish [src] with [O]!</span>")
if(do_after(user, 15, src))
if(banishable)
visible_message("<span class='warning'>[src] crumbles into dust!</span>")
gib()
else
visible_message("<span class='warning'>[src] is too strong to be banished!</span>")
Paralyse(rand(8,15))
/mob/living/simple_animal/hostile/statue/death()
new /obj/item/stack/material/marble(loc)
/mob/living/simple_animal/hostile/statue/Move(turf/NewLoc)
if(can_be_seen(NewLoc))
if(client)
to_chat(src, "<span class='warning'>You cannot move, there are eyes on you!</span>")
return 0
return ..()
/mob/living/simple_animal/hostile/statue/Life()
..()
handle_target()
handleAnnoyance()
if(target_mob) //if there's a victim, statue will use its powers
if((annoyance + 4) < 800)
annoyance += 4
else if ((annoyance - 2) > 0)
annoyance -= 2
/mob/living/simple_animal/hostile/statue/proc/handle_target()
if(target_mob) // If we have a target and we're AI controlled
var/mob/watching = can_be_seen()
// If they're not our target
if(watching && (watching != target_mob))
// This one is closer.
if(get_dist(watching, src) > get_dist(target_mob, src))
LoseTarget()
target_mob = watching
/mob/living/simple_animal/hostile/statue/proc/handleAnnoyance()
if(respond) //so it won't blind people 24/7
respond = 0
if (annoyance > 30)
AI_blind()
annoyance -= 30
if (prob(30) && annoyance > 30)
var/turf/T = get_turf(loc)
if(T.get_lumcount() * 10 > 1.5)
AI_flash()
annoyance -= 30
spawn(20)
respond = 1
/mob/living/simple_animal/hostile/statue/proc/AI_blind()
for(var/mob/living/L in oviewers(12, src)) //the range is so big, because it tries to keep out of sight and can't reengage if you get too far
if (prob(70))
if(ishuman(L))
var/mob/living/carbon/human/H = L
if (H.species == "Diona" || H.species == "Promethean" || H == creator)// can't blink and organic
return
to_chat(L, pick("<span class='notice'>Your eyes feel very heavy.</span>", "<span class='notice'>You blink suddenly!</span>", "<span class='notice'>Your eyes close involuntarily!</span>"))
L.Blind(2)
return
/mob/living/simple_animal/hostile/statue/proc/AI_flash()
if (prob(60))
visible_message("The statue slowly points at the light.")
for(var/obj/machinery/light/L in oview(12, src))
L.flicker()
return
/mob/living/simple_animal/hostile/statue/proc/AI_mirrorshmash()
for(var/obj/structure/mirror/M in oview(4, src))
if ((!M.shattered )||(!M.glass))
visible_message("The statue slowly points at the mirror!")
sleep(5)
M.shatter()
return
/mob/living/simple_animal/hostile/statue/AttackTarget()
if(can_be_seen(get_turf(loc)))
if(client)
to_chat(src, "<span class='warning'>You cannot attack, there are eyes on you!</span>")
return
else
spawn(3) //a small delay
..()
/mob/living/simple_animal/hostile/statue/DoPunch(var/atom/A) //had to redo that, since it's supposed to target only head and upper body
if(!Adjacent(A)) // They could've moved in the meantime.
return FALSE
var/damage_to_do = rand(melee_damage_lower, melee_damage_upper)
for(var/datum/modifier/M in modifiers)
if(!isnull(M.outgoing_melee_damage_percent))
damage_to_do *= M.outgoing_melee_damage_percent
// SA attacks can be blocked with shields.
if(ishuman(A))
var/mob/living/carbon/human/H = A
H.adjustBruteLossByPart(damage_to_do*0.9, pick(BP_HEAD, BP_TORSO))
playsound(src, attack_sound, 75, 1)
else if(A.attack_generic(src, damage_to_do, pick(attacktext), attack_armor_type, attack_armor_pen, attack_sharp, attack_edge) && attack_sound)
playsound(src, attack_sound, 75, 1)
return TRUE
/mob/living/simple_animal/hostile/statue/face_atom()
if(!can_be_seen(get_turf(loc)))
..()
/mob/living/simple_animal/hostile/statue/proc/can_be_seen(turf/destination)
if(!cannot_be_seen)
return null
var/turf/T = get_turf(loc)
/* if(T && destination && T.lighting_overlay)
if(T.get_lumcount() * 10 < 0.9 && destination.get_lumcount() * 10 < 0.9) // No one can see us in the darkness, right?
return null
if(T == destination)
destination = null*/
// loop for viewers.
var/list/check_list = list(src)
if(destination)
check_list += destination
//&& (M.see_in_dark > 5)
// This loop will, at most, loop twice.
for(var/atom/check in check_list)
for(var/mob/living/M in viewers(world.view + 1, check) - src)
if(M != creator)
if(!(M.sdisabilities & BLIND) || !(M.blinded)) //if not blinded
if(M.has_vision() && !M.isSynthetic()) //is able to see the statue
if(T && destination && T.lighting_overlay) // Check for darkness
if(T.get_lumcount() * 10 < 0.9 && destination.get_lumcount() * 10 < 0.9) // No one can see us in the darkness, right? WRONG! Damn cats.
if(M.see_in_dark > 5)
return M
return null
return M
for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you
if(M.occupant && M.occupant.client && M.occupant != creator)
if(M.occupant.has_vision() && !M.occupant.isSynthetic())
return M.occupant
for(var/obj/structure/mirror/M in view(3, check)) //Weeping angels hate mirrors. Probably because they're ugly af
if ((!M.shattered )||(!M.glass))
annoyance += 3
if (prob(5) && (ai_inactive == 0))
AI_mirrorshmash()
annoyance -= 50
return src //if it sees the mirror, it sees itself, right?
return null
// Cannot talk
/mob/living/simple_animal/hostile/statue/say()
return 0
// Turn to dust when gibbed
/mob/living/simple_animal/hostile/statue/gib()
dust()
// Stop attacking clientless mobs
/mob/living/simple_animal/hostile/statue/proc/CanAttack(atom/the_target) //ignore clientless mobs
if(isliving(the_target))
var/mob/living/L = the_target
if(!L.client && !L.ckey)
return 0
return ..()
// Statue powers
// Flicker lights
/spell/aoe_turf/flicker_lights
name = "Flicker Lights"
desc = "You will trigger a large amount of lights around you to flicker."
spell_flags = 0
charge_max = 400
range = 10
/spell/aoe_turf/flicker_lights/cast(list/targets, mob/user = usr)
for(var/turf/T in targets)
for(var/obj/machinery/light/L in T)
L.flicker()
return
//Blind AOE
/spell/aoe_turf/blindness
name = "Blindness"
desc = "Your prey will be momentarily blind for you to advance on them."
message = "<span class='notice'>You glare your eyes.</span>"
charge_max = 250
spell_flags = 0
range = 10
/spell/aoe_turf/blindness/cast(list/targets, mob/living/simple_animal/hostile/statue/user = usr)
for(var/mob/living/L in targets)
if(L == user || L == user.creator)
continue
var/turf/T = get_turf(L.loc)
if(T && T in targets)
L.Blind(4)
return
/spell/aoe_turf/shatter
name = "Shatter mirrors!"
desc = "That handsome devil has to wait. You have people to make into corpses."
message = "<span class='notice'>You glare your eyes.</span>"
charge_max = 300
spell_flags = 0
range = 8
/spell/aoe_turf/shatter/cast(list/targets, mob/user = usr)
spawn(50)
for(var/obj/structure/mirror/M in view(5, src))
if ((!M.shattered )||(!M.glass))
M.shatter()
return
/mob/living/simple_animal/hostile/statue/verb/toggle_darkness()
set name = "Toggle Darkness"
set desc = "You ARE the darkness."
set category = "Abilities"
seedarkness = !seedarkness
plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness)
to_chat(src,"You [seedarkness ? "now" : "no longer"] see darkness.")
/mob/living/simple_animal/hostile/statue/restrained()
. = ..()
if(can_be_seen(loc))
return 1
/mob/living/simple_animal/hostile/statue/ListTargets(dist = view_range)
var/list/L = mobs_in_xray_view(dist, src)
for(var/obj/mecha/M in mechas_list)
if ((M.z == src.z) && (get_dist(src, M) <= dist) && (isInSight(src,M)))
L += M
if(creator)
L -= creator
return L
/obj/item/cursed_marble //slime cube copypaste
name = "marble slab"
desc = "A peculiar slab of marble, radiating with dark energy."
icon = 'icons/obj/stacks.dmi'
icon_state = "sheet-marble"
description_info = "Summons the Statue - a mysterious powerful creature, that can move only when unsurveyed by living eyes."
var/searching = 0
/obj/item/cursed_marble/attack_self(mob/user as mob)
if(!searching)
to_chat(user, "<span class='warning'>You rub the slab in hopes a wandering spirit wishes to inhabit it. [src] starts to sparkle!</span>")
icon_state = "sheet-snowbrick"
searching = 1
request_player()
spawn(60 SECONDS)
reset_search()
/obj/item/cursed_marble/proc/request_player()
for(var/mob/observer/dead/O in player_list)
if(!O.MayRespawn())
continue
if(O.client)
if(O.client.prefs.be_special & BE_ALIEN)
question(O.client)
/obj/item/cursed_marble/proc/question(var/client/C)
spawn(0)
if(!C)
return
var/response = alert(C, "Someone is requesting a soul for the statue. Would you like to play as one?", "Statue request", "Yes", "No", "Never for this round")
if(response == "Yes")
response = alert(C, "Are you sure you want to play as the statue?", "Statue request", "Yes", "No")
if(!C || 2 == searching)
return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
if(response == "Yes")
transfer_personality(C.mob)
else if(response == "Never for this round")
C.prefs.be_special ^= BE_ALIEN
/obj/item/cursed_marble/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer.
icon_state = "sheet-marble"
if(searching == 1)
searching = 0
var/turf/T = get_turf_or_move(src.loc)
for (var/mob/M in viewers(T))
M.show_message("<span class='warning'>[src] fades. Maybe it will spark another time.</span>")
/obj/item/cursed_marble/proc/transfer_personality(var/mob/candidate)
announce_ghost_joinleave(candidate, 0, "They are a statue now.")
src.searching = 2
var/mob/living/simple_animal/hostile/statue/S = new(get_turf(src))
S.client = candidate.client
to_chat(S, "<b>You are \a [S], brought into existence on [station_name()] by [usr]! Obey all their orders.</b>")
S.mind.assigned_role = "The Statue"
visible_message("<span class='warning'>The slab suddenly takes the shape of a humanoid!</span>")
qdel(src)
/obj/item/cursed_marble/verb/crush() //if there's no ghosts to respond to your request/you want to use the statue for malicious stuff
set name = "Crush the marble slab"
set category = "Object"
set src in usr
summonmob(usr)
/obj/item/cursed_marble/proc/summonmob(mob/user as mob)
if(searching == 0)
var/choice = alert(user, "Are you sure you want to crush the marble? (this will spawn a clientless version of the statue, hostile to everyone, but you)", "Crush it?", "Yes", "No")
if(choice)
if(choice == "Yes")
var/mob/living/simple_animal/hostile/statue/S = new /mob/living/simple_animal/hostile/statue(get_turf(user))
visible_message("<span class='warning'>The slab suddenly takes the shape of a humanoid!</span>")
S.creator = user
qdel(src)
@@ -1,7 +1,7 @@
/mob/living/simple_animal/hostile/scarybat
name = "space bats"
desc = "A swarm of cute little blood sucking bats that looks pretty upset."
tt_desc = "Desmodus rotundus" //Common vampire bat
tt_desc = "N Bestia gregaria" //Nispean swarm bats, because of course Nisp has swarm bats
icon = 'icons/mob/bats.dmi'
icon_state = "bat"
icon_living = "bat"
@@ -1,8 +1,8 @@
//Space bears!
/mob/living/simple_animal/hostile/bear
name = "space bear"
desc = "RawrRawr!!"
tt_desc = "Ursinae aetherius" //...bearspace? Maybe.
desc = "A product of Space Russia?"
tt_desc = "U Ursinae aetherius" //...bearspace? Maybe.
icon_state = "bear"
icon_living = "bear"
icon_dead = "bear_dead"
@@ -1,7 +1,7 @@
/mob/living/simple_animal/hostile/carp
name = "space carp"
desc = "A ferocious, fang-bearing creature that resembles a fish."
tt_desc = "Cyprinus aetherius" //carpspace? maybe
tt_desc = "U Cyprinus aetherius" //carpspace? maybe
icon_state = "carp"
icon_living = "carp"
icon_dead = "carp_dead"
@@ -2,7 +2,7 @@
/mob/living/simple_animal/cat
name = "cat"
desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers."
tt_desc = "Felis catus"
tt_desc = "E Felis silvestris catus"
intelligence_level = SA_ANIMAL
icon_state = "cat2"
item_state = "cat2"
@@ -156,7 +156,7 @@
/mob/living/simple_animal/cat/fluff/Runtime
name = "Runtime"
desc = "Her fur has the look and feel of velvet, and her tail quivers occasionally."
tt_desc = "Felis medicalis"
tt_desc = "E Felis silvestris medicalis" //a hypoallergenic breed produced by NT for... medical purposes? Sure.
gender = FEMALE
icon_state = "cat"
item_state = "cat"
@@ -3,7 +3,7 @@
name = "corgi"
real_name = "corgi"
desc = "It's a corgi."
tt_desc = "Canis familiaris"
tt_desc = "E Canis lupus familiaris"
intelligence_level = SA_ANIMAL
icon_state = "corgi"
icon_living = "corgi"
@@ -38,7 +38,6 @@
real_name = "Ian" //Intended to hold the name without altering it.
gender = MALE
desc = "It's a corgi."
tt_desc = "Canis commandus"
var/turns_since_scan = 0
var/obj/movement_target
response_help = "pets"
@@ -2,7 +2,7 @@
/mob/living/simple_animal/crab
name = "crab"
desc = "A hard-shelled crustacean. Seems quite content to lounge around all the time."
tt_desc = "Ranina ranina"
tt_desc = "E Cancer bellianus"
icon_state = "crab"
icon_living = "crab"
icon_dead = "crab_dead"
@@ -52,6 +52,7 @@
/mob/living/simple_animal/giant_crab
name = "giant crab"
desc = "A large, hard-shelled crustacean. This one is mostly grey."
tt_desc = "S Cancer holligus"
icon_state = "sif_crab"
icon_living = "sif_crab"
icon_dead = "sif_crab_dead"
@@ -2,7 +2,7 @@
/mob/living/simple_animal/retaliate/goat
name = "goat"
desc = "Not known for their pleasant disposition."
tt_desc = "Oreamnos americanus"
tt_desc = "E Oreamnos americanus"
icon_state = "goat"
icon_living = "goat"
icon_dead = "goat_dead"
@@ -86,7 +86,7 @@
/mob/living/simple_animal/cow
name = "cow"
desc = "Known for their milk, just don't tip them over."
tt_desc = "Bos taurus"
tt_desc = "E Bos taurus"
icon_state = "cow"
icon_living = "cow"
icon_dead = "cow_dead"
@@ -155,7 +155,7 @@
/mob/living/simple_animal/chick
name = "\improper chick"
desc = "Adorable! They make such a racket though."
tt_desc = "Gallus domesticus"
tt_desc = "E Gallus gallus"
icon_state = "chick"
icon_living = "chick"
icon_dead = "chick_dead"
@@ -206,7 +206,7 @@ var/global/chicken_count = 0
/mob/living/simple_animal/chicken
name = "\improper chicken"
desc = "Hopefully the eggs are good this season."
tt_desc = "Gallus domesticus"
tt_desc = "E Gallus gallus"
icon_state = "chicken"
icon_living = "chicken"
icon_dead = "chicken_dead"
@@ -39,36 +39,42 @@
/mob/living/simple_animal/fish/bass
name = "bass"
tt_desc = "E Micropterus notius"
icon_state = "bass-swim"
icon_living = "bass-swim"
icon_dead = "bass-dead"
/mob/living/simple_animal/fish/trout
name = "trout"
tt_desc = "E Salmo trutta"
icon_state = "trout-swim"
icon_living = "trout-swim"
icon_dead = "trout-dead"
/mob/living/simple_animal/fish/salmon
name = "salmon"
tt_desc = "E Oncorhynchus nerka"
icon_state = "salmon-swim"
icon_living = "salmon-swim"
icon_dead = "salmon-dead"
/mob/living/simple_animal/fish/perch
name = "perch"
tt_desc = "E Perca flavescens"
icon_state = "perch-swim"
icon_living = "perch-swim"
icon_dead = "perch-dead"
/mob/living/simple_animal/fish/pike
name = "pike"
tt_desc = "E Esox aquitanicus"
icon_state = "pike-swim"
icon_living = "pike-swim"
icon_dead = "pike-dead"
/mob/living/simple_animal/fish/koi
name = "koi"
tt_desc = "E Cyprinus rubrofuscus"
icon_state = "koi-swim"
icon_living = "koi-swim"
icon_dead = "koi-dead"
@@ -8,7 +8,7 @@
/mob/living/simple_animal/hostile/giant_spider
name = "giant spider"
desc = "Furry and brown, it makes you shudder to look at it. This one has deep red eyes."
tt_desc = "Atrax robustus gigantus"
tt_desc = "X Brachypelma phorus"
icon_state = "guard"
icon_living = "guard"
icon_dead = "guard_dead"
@@ -68,6 +68,7 @@ Nurse Family
//nursemaids - these create webs and eggs
/mob/living/simple_animal/hostile/giant_spider/nurse
desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes."
tt_desc = "X Brachypelma phorus laetus"
icon_state = "nurse"
icon_living = "nurse"
icon_dead = "nurse_dead"
@@ -102,6 +103,7 @@ Nurse Family
/mob/living/simple_animal/hostile/giant_spider/nurse/queen
desc = "Absolutely gigantic, this creature is horror itself."
tt_desc = "X Brachypelma phorus tyrannus"
icon = 'icons/mob/64x64.dmi'
icon_state = "spider_queen"
icon_living = "spider_queen"
@@ -124,6 +126,7 @@ Nurse Family
/mob/living/simple_animal/hostile/giant_spider/webslinger
desc = "Furry and green, it makes you shudder to look at it. This one has brilliant green eyes, and a cloak of web."
tt_desc = "X Brachypelma phorus balisticus"
icon_state = "webslinger"
icon_living = "webslinger"
icon_dead = "webslinger_dead"
@@ -164,6 +167,7 @@ Nurse Family
/mob/living/simple_animal/hostile/giant_spider/carrier
desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes."
tt_desc = "X Brachypelma phorus gerulus"
icon_state = "carrier"
icon_living = "carrier"
icon_dead = "carrier_dead"
@@ -223,6 +227,7 @@ Hunter Family
/mob/living/simple_animal/hostile/giant_spider/hunter
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
tt_desc = "X Brachypelma phorus venandi"
icon_state = "hunter"
icon_living = "hunter"
icon_dead = "hunter_dead"
@@ -235,6 +240,7 @@ Hunter Family
/mob/living/simple_animal/hostile/giant_spider/lurker
desc = "Translucent and white, it makes you shudder to look at it. This one has incandescent red eyes."
tt_desc = "X Brachypelma phorus insidator"
icon_state = "lurker"
icon_living = "lurker"
icon_dead = "lurker_dead"
@@ -258,6 +264,7 @@ Hunter Family
/mob/living/simple_animal/hostile/giant_spider/tunneler
desc = "Sandy and brown, it makes you shudder to look at it. This one has glittering yellow eyes."
tt_desc = "X Brachypelma phorus cannalis"
icon_state = "tunneler"
icon_living = "tunneler"
icon_dead = "tunneler_dead"
@@ -288,6 +295,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/pepper
desc = "Red and brown, it makes you shudder to look at it. This one has glinting red eyes."
tt_desc = "X Brachypelma phorus ignis"
icon_state = "pepper"
icon_living = "pepper"
icon_dead = "pepper_dead"
@@ -308,6 +316,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/thermic
desc = "Mirage-cloaked and orange, it makes you shudder to look at it. This one has simmering orange eyes."
tt_desc = "X Brachypelma phorus incaendium"
icon_state = "pit"
icon_living = "pit"
icon_dead = "pit_dead"
@@ -324,6 +333,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/electric
desc = "Spined and yellow, it makes you shudder to look at it. This one has flickering gold eyes."
tt_desc = "X Brachypelma phorus aromatitis"
icon_state = "spark"
icon_living = "spark"
icon_dead = "spark_dead"
@@ -347,6 +357,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/phorogenic
desc = "Crystalline and purple, it makes you shudder to look at it. This one has haunting purple eyes."
tt_desc = "X Brachypelma phorus phorus"
icon_state = "phoron"
icon_living = "phoron"
icon_dead = "phoron_dead"
@@ -380,6 +391,7 @@ Guard Family
/mob/living/simple_animal/hostile/giant_spider/frost
desc = "Icy and blue, it makes you shudder to look at it. This one has brilliant blue eyes."
tt_desc = "X Brachypelma phorus pruinae"
icon_state = "frost"
icon_living = "frost"
icon_dead = "frost_dead"
@@ -1,7 +1,7 @@
/mob/living/simple_animal/hostile/goose
name = "space goose"
desc = "That's no duck. That's a space goose. You have a bad feeling about this."
tt_desc = "Anser aetherius" //Goose space?!
/mob/living/simple_animal/hostile/goose //hey are these even in the game
name = "goose"
desc = "It looks pretty angry!"
tt_desc = "E Branta canadensis" //that iconstate is just a regular goose
icon_state = "goose"
icon_living = "goose"
icon_dead = "goose_dead"
@@ -1,7 +1,7 @@
/mob/living/simple_animal/lizard
name = "Lizard"
desc = "A cute tiny lizard."
tt_desc = "Gekko gecko"
tt_desc = "E Anolis cuvieri"
icon = 'icons/mob/critter.dmi'
icon_state = "lizard"
icon_living = "lizard"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/yithian
name = "yithian"
desc = "A friendly creature vaguely resembling an oversized snail without a shell."
tt_desc = "J Escargot escargot" // a product of Jade, which is a planet that totally exists
icon_state = "yithian"
icon_living = "yithian"
icon_dead = "yithian_dead"
@@ -11,6 +12,7 @@
/mob/living/simple_animal/tindalos
name = "tindalos"
desc = "It looks like a large, flightless grasshopper."
tt_desc = "J Locusta bruchus"
icon_state = "tindalos"
icon_living = "tindalos"
icon_dead = "tindalos_dead"
@@ -2,7 +2,7 @@
name = "mouse"
real_name = "mouse"
desc = "It's a small rodent."
tt_desc = "Mus musculus"
tt_desc = "E Mus musculus"
icon_state = "mouse_gray"
item_state = "mouse_gray"
icon_living = "mouse_gray"
@@ -31,7 +31,7 @@
/mob/living/simple_animal/parrot
name = "parrot"
desc = "The parrot squawks, \"It's a parrot! BAWWK!\""
tt_desc = "Poicephalus robustus"
tt_desc = "E Ara macao"
icon = 'icons/mob/animal.dmi'
icon_state = "parrot_fly"
icon_living = "parrot_fly"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/retaliate/diyaab
name = "diyaab"
desc = "A small pack animal. Although omnivorous, it will hunt meat on occasion."
tt_desc = "S Choeros hirtus" //diyaab and shantak are technically reletives!
faction = "diyaab"
icon_state = "diyaab"
icon_living = "diyaab"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/savik
name = "savik"
desc = "A fast, armoured predator accustomed to hiding and ambushing in cold terrain."
tt_desc = "S Pistris tellus" //landshark
faction = "savik"
icon_state = "savik"
icon_living = "savik"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/shantak
name = "shantak"
desc = "A piglike creature with a bright iridiscent mane that sparkles as though lit by an inner light. Don't be fooled by its beauty though."
tt_desc = "S Choeros shantak"
faction = "shantak"
icon_state = "shantak"
icon_living = "shantak"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/tomato
name = "tomato"
desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!"
tt_desc = "X Solanum abominable"
icon_state = "tomato"
icon_living = "tomato"
icon_dead = "tomato_dead"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/tree
name = "pine tree"
desc = "A pissed off tree-like alien. It seems annoyed with the festivities..."
tt_desc = "X Festivus tyrannus"
icon = 'icons/obj/flora/pinetrees.dmi'
icon_state = "pine_1"
icon_living = "pine_1"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/clown
name = "clown"
desc = "A denizen of clown planet"
tt_desc = "E Homo sapiens corydon" //this is an actual clown, as opposed to someone dressed up as one
icon_state = "clown"
icon_living = "clown"
icon_dead = "clown_dead"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/pirate
name = "Pirate"
desc = "Does what he wants cause a pirate is free."
tt_desc = "E Homo sapiens"
icon_state = "piratemelee"
icon_living = "piratemelee"
icon_dead = "piratemelee_dead"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/russian
name = "russian"
desc = "For the Motherland!"
tt_desc = "E Homo sapiens"
icon_state = "russianmelee"
icon_living = "russianmelee"
icon_dead = "russianmelee_dead"
@@ -1,6 +1,7 @@
/mob/living/simple_animal/hostile/syndicate
name = "mercenary"
desc = "Death to the Company."
tt_desc = "E Homo sapiens"
icon_state = "syndicate"
icon_living = "syndicate"
icon_dead = "syndicate_dead"
@@ -1227,7 +1227,7 @@
if(astarpathing) ForgetPath()
ai_log("GoHome()",1)
var/close_enough = 2
var/look_in = 250
var/look_in = 50
if(GetPath(home_turf,close_enough,look_in))
stop_automated_movement = 1
spawn(1)
@@ -1,6 +1,7 @@
/mob/living/simple_animal/slime
name = "slime"
desc = "The most basic of slimes. The grey slime has no remarkable qualities, however it remains one of the most useful colors for scientists."
tt_desc = "A Macrolimbus vulgaris"
icon = 'icons/mob/slime2.dmi'
icon_state = "grey baby slime"
intelligence_level = SA_ANIMAL
+9 -9
View File
@@ -347,20 +347,20 @@
set category = "OOC"
if (!( config.abandon_allowed ))
usr << "<span class='notice'>Respawn is disabled.</span>"
to_chat(usr, "<span class='notice'>Respawn is disabled.</span>")
return
if ((stat != 2 || !( ticker )))
usr << "<span class='notice'><B>You must be dead to use this!</B></span>"
to_chat(usr, "<span class='notice'><B>You must be dead to use this!</B></span>")
return
if (ticker.mode && ticker.mode.deny_respawn) //BS12 EDIT
usr << "<span class='notice'>Respawn is disabled for this roundtype.</span>"
to_chat(usr, "<span class='notice'>Respawn is disabled for this roundtype.</span>")
return
else
var/deathtime = world.time - src.timeofdeath
if(istype(src,/mob/observer/dead))
var/mob/observer/dead/G = src
if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
usr << "<font color='blue'><B>Upon using the antagHUD you forfeighted the ability to join the round.</B></font>"
to_chat(usr, "<font color='blue'><B>By using the antagHUD you forfeit the ability to join the round.</B></font>")
return
var/deathtimeminutes = round(deathtime / 600)
var/pluralcheck = "minute"
@@ -371,17 +371,17 @@
else if(deathtimeminutes > 1)
pluralcheck = " [deathtimeminutes] minutes and"
var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1)
usr << "You have been dead for[pluralcheck] [deathtimeseconds] seconds."
to_chat(usr, "You have been dead for[pluralcheck] [deathtimeseconds] seconds.")
if (deathtime < (600)) //VOREStation Edit
usr << "You must wait 60 seconds to respawn!" //VOREStation Edit
if ((deathtime < (5 * 600)) && (ticker && ticker.current_state > GAME_STATE_PREGAME))
to_chat(usr, "You must wait 5 minutes to respawn!")
return
else
usr << "You can respawn now, enjoy your new life!"
to_chat(usr, "You can respawn now, enjoy your new life!")
log_game("[usr.name]/[usr.key] used abandon mob.")
usr << "<font color='blue'><B>Make sure to play a different character, and please roleplay correctly!</B></font>"
to_chat(usr, "<font color='blue'><B>Make sure to play a different character, and please roleplay correctly!</B></font>")
if(!client)
log_game("[usr.key] AM failed due to disconnect.")