mirror of
https://github.com/KabKebab/GS13.git
synced 2026-08-22 12:36:16 +01:00
Merge remote-tracking branch 'upstream/master' into funnylore
This commit is contained in:
@@ -22,3 +22,8 @@
|
||||
description = "<span class='warning'>I feel like I'm held together by flimsy string, and could fall apart at any moment!</span>\n"
|
||||
mood_change = -4
|
||||
timeout = 2 MINUTES
|
||||
|
||||
/datum/mood_event/copium
|
||||
description = "<span class='nicegreen'>Things are going to be okay, right?</span>\n"
|
||||
mood_change = 3
|
||||
timeout = 3 MINUTES
|
||||
|
||||
@@ -40,7 +40,7 @@ GLOBAL_DATUM_INIT(lore_terminal_controller, /datum/lore_controller, new)
|
||||
/obj/machinery/computer/lore_terminal/proc/get_entries()
|
||||
for(var/X in GLOB.lore_terminal_controller.entries)
|
||||
var/datum/lore_entry/instance = X
|
||||
if(instance.access_tag == access_tag)
|
||||
if(instance.access_tag == access_tag || instance.access_tag == "all")
|
||||
entries += instance
|
||||
|
||||
/obj/machinery/computer/lore_terminal/attack_hand(mob/user)
|
||||
@@ -198,7 +198,7 @@ SPECIAL KEYS RESPOND AS FOLLOWS:
|
||||
|
||||
` = newline (br) (AKA when you press enter)
|
||||
~ = horizontal line (hr)
|
||||
� = bullet point
|
||||
� = bullet point //Bullet points are not working? - archie
|
||||
|
||||
*/
|
||||
|
||||
@@ -208,7 +208,13 @@ SPECIAL KEYS RESPOND AS FOLLOWS:
|
||||
path = "lore_entries/welcome.txt"
|
||||
access_tag = "kncommon"
|
||||
|
||||
/datum/lore_entry/station/meltdown_proceedures
|
||||
/datum/lore_entry/all
|
||||
name = "nuclear_authdisk_instructions.mail"
|
||||
title = "Handling the Nuclear Authentication Disk and You!"
|
||||
content = "SYSADMIN -> allcrew@seegnet.kin. RE: The Nuclear Authentication Disk. ` Greetings staff members! We're aware of the questions you have in regards to the Nuclear Authentication disk. The disk itself contains the codes needed to unlock nuclear devices used in a Nuclear Emergency and trigger a station self-destruction sequence. ` It is the duty of every member of this crew to take responsibility for the disk in the off chance that station command is currently absent. ` Even though Layenia itself is a mobile facility and prevents Disk Triangulation in most circumstances, it is still important to hold onto the disk even when not needed- it is a good formality and keeps things secure! ` If the disk location is unknown, look for a red pinpointer, the Head of Security and the Captain should always have one in their offices or lockers. These will help you locate the disk. ` If the disk is in enemy hands, call all hands on deck immediately and order a red alert. ` ` Protect the disk with your life, for the lives of the station's crew depend on it. Stay safe through vigilance."
|
||||
access_tag = "all"
|
||||
|
||||
/datum/lore_entry/all/meltdown_proceedures
|
||||
name = "meltdown_proceedures.mail"
|
||||
title = "Emergency proceedures regarding nuclear meltdowns:"
|
||||
path = "lore_entries/meltdowns.txt"
|
||||
|
||||
@@ -39,7 +39,8 @@
|
||||
/obj/effect/collapse,
|
||||
/obj/effect/particle_effect/ion_trails,
|
||||
/obj/effect/dummy/phased_mob,
|
||||
/obj/effect/immovablerod
|
||||
/obj/effect/immovablerod,
|
||||
/obj/effect/crystalline_reentry
|
||||
)) //Gotta make sure certain things can phase through it otherwise the railings also block them.
|
||||
|
||||
/obj/structure/railing/CanPass(atom/movable/mover, turf/target)
|
||||
@@ -158,4 +159,4 @@
|
||||
else
|
||||
usr.forceMove(get_turf(src))
|
||||
|
||||
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
|
||||
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
|
||||
|
||||
@@ -111,3 +111,59 @@
|
||||
|
||||
/obj/effect/mob_spawn/human/exiled/special(mob/living/carbon/human/new_spawn)
|
||||
ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT)
|
||||
|
||||
//Villagers: Once a group of servants that worshiped their 'Gods-Kings', but now finally free after their overlords have abandoned the planet.
|
||||
|
||||
/obj/effect/mob_spawn/human/villager
|
||||
name = "used bed"
|
||||
desc = "Still warm."
|
||||
mob_name = "villager"
|
||||
job_description = "Villagers"
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "bed"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
mob_species = /datum/species/human
|
||||
short_desc = "You're finally free."
|
||||
flavour_text = "After the God-Kings have abandoned the land, your people are finally free from their oppression. \
|
||||
Still, the reasons for their departure are a mystery, and now your people need to work together to survive in this world."
|
||||
assignedrole = "Free villager"
|
||||
mirrorcanloadappearance = TRUE
|
||||
|
||||
/obj/effect/mob_spawn/human/villager/Initialize(mapload)
|
||||
. = ..()
|
||||
var/arrpee = rand(1,3)
|
||||
switch(arrpee)
|
||||
if(1)
|
||||
flavour_text += "You were a guard, serving your gods to keep control of you own people. \
|
||||
Now that they left, you work to defend the village."
|
||||
outfit.head = /obj/item/clothing/head/pharaoh
|
||||
outfit.uniform = /obj/item/clothing/under/mummy
|
||||
outfit.suit = /obj/item/clothing/suit/nemes
|
||||
outfit.shoes = /obj/item/clothing/shoes/sandal
|
||||
outfit.back = /obj/item/storage/backpack/satchel/leather
|
||||
outfit.implants = list(/obj/item/implant/exile) //Made it so they cannot simply exit through the gateway at will.
|
||||
if(2)
|
||||
flavour_text += "You were a farmer, working extensively for years in the field to feed your people. \
|
||||
The work hasn't changed much since the departure of the gods..."
|
||||
outfit.head = /obj/item/clothing/head/rice_hat
|
||||
outfit.uniform = /obj/item/clothing/under/mummy
|
||||
outfit.suit = /obj/item/clothing/suit/nemes
|
||||
outfit.shoes = /obj/item/clothing/shoes/sandal
|
||||
outfit.back = /obj/item/storage/backpack/satchel/leather
|
||||
outfit.implants = list(/obj/item/implant/exile) //Made it so they cannot simply exit through the gateway at will.
|
||||
if(3)
|
||||
flavour_text += "You were a servant, doing any necessary work that was thrown at you. \
|
||||
At least it gave you experience in a bit of everything, which can be useful in these new times."
|
||||
outfit.uniform = /obj/item/clothing/under/mummy
|
||||
outfit.suit = /obj/item/clothing/suit/nemes
|
||||
outfit.shoes = /obj/item/clothing/shoes/sandal
|
||||
outfit.back = /obj/item/storage/backpack/satchel/leather
|
||||
outfit.implants = list(/obj/item/implant/exile) //Made it so they cannot simply exit through the gateway at will.
|
||||
|
||||
/obj/effect/mob_spawn/human/villager/Destroy()
|
||||
new/obj/structure/bed(get_turf(src))
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/villager/special(mob/living/carbon/human/new_spawn)
|
||||
ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT)
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
/datum/emote/living/chirp
|
||||
key = "chirp"
|
||||
key_third_person = "chirps!"
|
||||
message = "chirps!"
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
muzzle_ignore = FALSE
|
||||
restraint_check = FALSE
|
||||
mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
|
||||
|
||||
/datum/emote/living/chirp/run_emote(mob/living/user, params)
|
||||
if(!(. = ..()))
|
||||
return
|
||||
if(user.nextsoundemote >= world.time)
|
||||
return
|
||||
user.nextsoundemote = world.time + 7
|
||||
playsound(user, 'sound/voice/chirp.ogg', 50, 1, -1)
|
||||
|
||||
/datum/emote/living/caw
|
||||
key = "caw"
|
||||
key_third_person = "caws!"
|
||||
message = "caws!"
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
muzzle_ignore = FALSE
|
||||
restraint_check = FALSE
|
||||
mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
|
||||
|
||||
/datum/emote/living/caw/run_emote(mob/living/user, params)
|
||||
if(!(. = ..()))
|
||||
return
|
||||
if(user.nextsoundemote >= world.time)
|
||||
return
|
||||
user.nextsoundemote = world.time + 7
|
||||
playsound(user, 'sound/voice/caw.ogg', 50, 1, -1)
|
||||
+124
-103
@@ -33,25 +33,26 @@
|
||||
wander = TRUE
|
||||
minbodytemp = 250 //weak to cold
|
||||
maxbodytemp = 1500
|
||||
pressure_resistance = 600
|
||||
pressure_resistance = 1200
|
||||
sight = SEE_MOBS
|
||||
var/unstealth = FALSE
|
||||
var/stealthed = TRUE
|
||||
var/knockdown_people = 1
|
||||
var/playerTransformCD = 50
|
||||
var/playerTfTime
|
||||
var/static/mimic_blacklisted_transform_items = typecacheof(list(
|
||||
/obj/item/projectile,
|
||||
/obj/item/radio/intercom))
|
||||
/obj/item/radio/intercom,
|
||||
/mob/living/simple_animal/bot))
|
||||
var/playstyle_string = "<span class='boldannounce'>You are a mimic</span></b>, a tricky creature that can take the form of \
|
||||
almost any item nearby by shift-clicking it. While morphed, you move slowly and do less damage. \
|
||||
Finally, you can restore yourself to your original form while morphed by shift-clicking yourself. \
|
||||
Attacking carbon lifeforms will heal you at the cost of destructuring their DNA.</b>"
|
||||
Attacking carbon lifeforms will heal you at the cost of destructuring their DNA. \
|
||||
You can also change your form to that of simple animals, but be wary that anyone examining you can \
|
||||
find out.</b>"
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/Initialize()
|
||||
. = ..()
|
||||
// When initialized, make sure they take the form of something.
|
||||
unstealth = FALSE
|
||||
trytftorandomobject()
|
||||
trytftorandomobject() // When initialized, make sure they take the form of something.
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/Login()
|
||||
. = ..()
|
||||
@@ -60,26 +61,37 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/attack_hand(mob/living/carbon/human/M)
|
||||
. = ..()
|
||||
trigger()
|
||||
if(stealthed && stat == CONSCIOUS)
|
||||
if(M.a_intent == INTENT_HELP)//They're trying to pick us up! We tricked them boys! *plays runescape sea shanty*
|
||||
target = M
|
||||
guaranteedknockdown(M)
|
||||
trigger() // Bring our friends if any!
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/AttackingTarget()
|
||||
. = ..()
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
if(unstealth == FALSE && knockdown_people && .) //Guaranteed knockdown if we get the first hit while disguised. Typically, only players can do this since NPC mimics transform first before attacking.
|
||||
unstealth = TRUE
|
||||
restore()
|
||||
C.Knockdown(40)
|
||||
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
|
||||
"<span class='userdanger'>\The [src] knocks you down!</span>")
|
||||
else if(knockdown_people && . && prob(15))
|
||||
C.Knockdown(40)
|
||||
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
|
||||
if(.)
|
||||
if(stealthed && knockdown_people) //Guaranteed knockdown if we get the first hit while disguised. Typically, only players can do this since NPC mimics transform first before attacking.
|
||||
restore()
|
||||
C.Knockdown(40)
|
||||
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
|
||||
"<span class='userdanger'>\The [src] knocks you down!</span>")
|
||||
if(C.nutrition >= 15)
|
||||
C.nutrition -= (rand(7,15)) //They lose 7-15 nutrition
|
||||
adjustBruteLoss(-3) //We heal 3 damage
|
||||
C.adjustCloneLoss(rand(2,4)) //They also take a bit of cellular damage.
|
||||
else if(knockdown_people && prob(15))
|
||||
C.Knockdown(40)
|
||||
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
|
||||
"<span class='userdanger'>\The [src] knocks you down!</span>")
|
||||
if(C.nutrition >= 15)
|
||||
C.nutrition -= (rand(7,15)) //They lose 7-15 nutrition
|
||||
adjustBruteLoss(-3) //We heal 3 damage
|
||||
C.adjustCloneLoss(rand(2,4)) //They also take a bit of cellular damage.
|
||||
if(isanimal(target))
|
||||
var/mob/living/simple_animal/A = target
|
||||
if(.)
|
||||
if(stealthed)
|
||||
restore()
|
||||
if(A.stat == CONSCIOUS)
|
||||
adjustBruteLoss(-3) //We heal 3 damage
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
|
||||
trigger()
|
||||
@@ -88,95 +100,97 @@
|
||||
/mob/living/simple_animal/hostile/hs13mimic/FindTarget()
|
||||
. = ..()
|
||||
if(.)
|
||||
trigger()
|
||||
else if(!target && unstealth)
|
||||
trigger() //We have a target! Trigger!
|
||||
else if(!target && !stealthed) //Has no target, isn't stealthed, let's search for an object to transform
|
||||
trytftorandomobject()
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/death(gibbed)
|
||||
restore()
|
||||
restore() //We died. Restore form.
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/med_hud_set_health()
|
||||
if(!unstealth)
|
||||
if(stealthed)
|
||||
var/image/holder = hud_list[HEALTH_HUD]
|
||||
holder.icon_state = null
|
||||
return //we hide medical hud while morphed
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/med_hud_set_status()
|
||||
if(!unstealth)
|
||||
if(stealthed)
|
||||
var/image/holder = hud_list[STATUS_HUD]
|
||||
holder.icon_state = null
|
||||
return //we hide medical hud while morphed
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/proc/Mimictransform() //The list of default things to transform needs to be bigger, consider this in the future.
|
||||
/mob/living/simple_animal/hostile/hs13mimic/proc/mimicTransformList() //The list of default things to transform needs to be bigger, consider this in the future.
|
||||
var/transformitem = rand(1,100)
|
||||
medhudupdate()
|
||||
if(unstealth == FALSE)
|
||||
wander = FALSE
|
||||
vision_range = initial(vision_range)
|
||||
switch(transformitem)
|
||||
if(1 to 10)
|
||||
name = "drinking glass"
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
icon_state = "glass_empty"
|
||||
desc = "Your standard drinking glass."
|
||||
if(11 to 20)
|
||||
name = "insulated gloves"
|
||||
icon = 'icons/obj/clothing/gloves.dmi'
|
||||
icon_state = "yellow"
|
||||
desc = "These gloves will protect the wearer from electric shock."
|
||||
if(21 to 30)
|
||||
name = "Private Security Officer"
|
||||
desc = "A cardboard cutout of a private security officer."
|
||||
icon = 'icons/obj/cardboard_cutout.dmi'
|
||||
icon_state = "cutout_ntsec"
|
||||
if(31 to 40)
|
||||
name = "pen"
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "pen"
|
||||
desc = "It's a black ink pen, modified for use with both paper and Nanotransen-brand Digital-Readpads™!"
|
||||
if(41 to 50)
|
||||
name = "newspaper"
|
||||
desc = "An issue of The Griffon, the newspaper circulating aboard Kin.Co Space Stations."
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "newspaper"
|
||||
if(51 to 60)
|
||||
name = "toolbox"
|
||||
desc = "Danger. Very robust."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "red"
|
||||
if(61 to 70)
|
||||
name = "emergency oxygen tank"
|
||||
desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it."
|
||||
icon = 'icons/obj/tank.dmi'
|
||||
icon_state = "emergency"
|
||||
if(71 to 80)
|
||||
name = "drinking glass"
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
icon_state = "glass_empty"
|
||||
desc = "Your standard drinking glass."
|
||||
if(81 to 90)
|
||||
name = "fleshlight"
|
||||
icon = 'hyperstation/icons/obj/fleshlight.dmi'
|
||||
icon_state = "fleshlight_totallynotamimic"
|
||||
desc = "A sex toy disguised as a flashlight, used to stimulate someones penis, complete with colour changing sleeve."
|
||||
if(91 to 100)
|
||||
icon = 'modular_citadel/icons/obj/genitals/dildo.dmi'
|
||||
switch(rand(1,3)) //switch within a switch hmmmmmmmmmm
|
||||
if(1)
|
||||
icon_state = "dildo_knotted_2"
|
||||
name = "small knotted dildo"
|
||||
if(2)
|
||||
icon_state = "dildo_flared_4"
|
||||
name = "huge flared dildo"
|
||||
if(3)
|
||||
icon_state = "dildo_knotted_3"
|
||||
name = "big knotted dildo"
|
||||
desc = "Floppy!"
|
||||
else
|
||||
restore()
|
||||
wander = FALSE
|
||||
vision_range = initial(vision_range)
|
||||
switch(transformitem)
|
||||
if(1 to 10)
|
||||
name = "drinking glass"
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
icon_state = "glass_empty"
|
||||
desc = "Your standard drinking glass."
|
||||
if(11 to 20)
|
||||
name = "insulated gloves"
|
||||
icon = 'icons/obj/clothing/gloves.dmi'
|
||||
icon_state = "yellow"
|
||||
desc = "These gloves will protect the wearer from electric shock."
|
||||
if(21 to 30)
|
||||
name = "Private Security Officer"
|
||||
desc = "A cardboard cutout of a private security officer."
|
||||
icon = 'icons/obj/cardboard_cutout.dmi'
|
||||
icon_state = "cutout_ntsec"
|
||||
if(31 to 40)
|
||||
name = "pen"
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "pen"
|
||||
desc = "It's a black ink pen, modified for use with both paper and Nanotransen-brand Digital-Readpads™!"
|
||||
if(41 to 50)
|
||||
name = "newspaper"
|
||||
desc = "An issue of The Griffon, the newspaper circulating aboard Kin.Co Space Stations."
|
||||
icon = 'icons/obj/bureaucracy.dmi'
|
||||
icon_state = "newspaper"
|
||||
if(51 to 60)
|
||||
name = "toolbox"
|
||||
desc = "Danger. Very robust."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "red"
|
||||
if(61 to 70)
|
||||
name = "emergency oxygen tank"
|
||||
desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it."
|
||||
icon = 'icons/obj/tank.dmi'
|
||||
icon_state = "emergency"
|
||||
if(71 to 80)
|
||||
name = "drinking glass"
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
icon_state = "glass_empty"
|
||||
desc = "Your standard drinking glass."
|
||||
if(81 to 90)
|
||||
name = "fleshlight"
|
||||
icon = 'hyperstation/icons/obj/fleshlight.dmi'
|
||||
icon_state = "fleshlight_totallynotamimic"
|
||||
desc = "A sex toy disguised as a flashlight, used to stimulate someones penis, complete with colour changing sleeve."
|
||||
if(91 to 100)
|
||||
icon = 'modular_citadel/icons/obj/genitals/dildo.dmi'
|
||||
switch(rand(1,3)) //switch within a switch hmmmmmmmmmm
|
||||
if(1)
|
||||
icon_state = "dildo_knotted_2"
|
||||
name = "small knotted dildo"
|
||||
if(2)
|
||||
icon_state = "dildo_flared_4"
|
||||
name = "huge flared dildo"
|
||||
if(3)
|
||||
icon_state = "dildo_knotted_3"
|
||||
name = "big knotted dildo"
|
||||
desc = "Floppy!"
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/proc/guaranteedknockdown(mob/living/carbon/human/M)
|
||||
M.Knockdown(40)
|
||||
M.visible_message("<span class='danger'>\The [src] knocks down \the [M]!</span>", \
|
||||
"<span class='userdanger'>\The [src] tricks you, knocking you down!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/proc/medhudupdate()
|
||||
med_hud_set_health()
|
||||
@@ -184,6 +198,7 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/proc/restore()
|
||||
//back to normal mimic sprite
|
||||
stealthed = FALSE
|
||||
medhudupdate()
|
||||
name = initial(name)
|
||||
icon = 'hyperstation/icons/mobs/mimic.dmi'
|
||||
@@ -194,10 +209,9 @@
|
||||
vision_range = 9
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/proc/trigger()
|
||||
if(unstealth == FALSE && !stat)
|
||||
unstealth = TRUE
|
||||
if(stealthed && stat == CONSCIOUS)
|
||||
visible_message("<span class='danger'>The [src] Reveals itself to be a Mimic!</span>")
|
||||
Mimictransform()
|
||||
restore()
|
||||
playsound(loc, 'hyperstation/sound/creatures/mimictransform.ogg', 75, TRUE)
|
||||
triggerOthers(target) // Friends too!
|
||||
|
||||
@@ -208,7 +222,7 @@
|
||||
C.trigger()
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/proc/trytftorandomobject()
|
||||
unstealth = FALSE
|
||||
stealthed = TRUE
|
||||
medhudupdate()
|
||||
var/list/obj/item/listItems = list()
|
||||
for(var/obj/item/I in oview(9,src.loc))
|
||||
@@ -223,32 +237,39 @@
|
||||
icon_state = changedReference.icon_state
|
||||
desc = changedReference.desc
|
||||
else
|
||||
Mimictransform()
|
||||
mimicTransformList() //Couldn't find any valid items, let's go for the default list then.
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/proc/allowed(atom/movable/A)
|
||||
return !is_type_in_typecache(A, mimic_blacklisted_transform_items) && (isitem(A))
|
||||
return !is_type_in_typecache(A, mimic_blacklisted_transform_items) && (isitem(A) || isanimal(A))
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/ShiftClickOn(atom/movable/A) //if by any chance a player takes control of them
|
||||
if(playerTfTime <= world.time && !stat)
|
||||
//Player control code
|
||||
|
||||
/mob/living/simple_animal/hostile/hs13mimic/ShiftClickOn(atom/movable/A)
|
||||
if(playerTfTime <= world.time && stat == CONSCIOUS)
|
||||
if(A == src)
|
||||
restore()
|
||||
playerTfTime = world.time + playerTransformCD
|
||||
return
|
||||
if(istype(A) && allowed(A))
|
||||
unstealth = FALSE
|
||||
stealthed = TRUE
|
||||
SEND_SOUND(src, sound('hyperstation/sound/creatures/mimictransform.ogg',volume=50))
|
||||
name = A.name
|
||||
icon = A.icon
|
||||
icon_state = A.icon_state
|
||||
desc = A.desc
|
||||
speed = 5
|
||||
playerTfTime = world.time + playerTransformCD
|
||||
if(isanimal(A))
|
||||
var/mob/living/simple_animal/animal = A
|
||||
icon_state = animal.icon_living
|
||||
desc += "<span class='warning'> But something about it seems wrong...</span>"
|
||||
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You need to wait a little longer before you can shift into something else!</span>")
|
||||
..()
|
||||
|
||||
//Event control
|
||||
|
||||
|
||||
/datum/round_event_control/mimic_infestation
|
||||
name = "Mimic Infestation"
|
||||
typepath = /datum/round_event/mimic_infestation
|
||||
@@ -271,7 +292,7 @@
|
||||
/area/engine/atmospherics_engine,
|
||||
/area/engine/engineering/reactor_core,
|
||||
/area/engine/engineering/reactor_control,
|
||||
/area/ai_monitored/turret_protected/ai,
|
||||
/area/ai_monitored/turret_protected,
|
||||
/area/layenia/cloudlayer,
|
||||
/area/asteroid/nearstation,
|
||||
/area/science/server,
|
||||
@@ -337,7 +358,7 @@
|
||||
return WAITING_FOR_SOMETHING
|
||||
|
||||
notify_ghosts("A group of mimics has spawned in [pickedArea]!", source=pickedArea, action=NOTIFY_ATTACK, flashwindow = FALSE)
|
||||
while(spawncount >= 1 && validTurfs.len)
|
||||
while(spawncount > 0 && validTurfs.len)
|
||||
var/turf/pickedTurf = pick_n_take(validTurfs)
|
||||
var/spawn_type = /mob/living/simple_animal/hostile/hs13mimic
|
||||
spawn_atom_to_turf(spawn_type, pickedTurf, 1, FALSE)
|
||||
|
||||
@@ -131,11 +131,8 @@
|
||||
return ..()
|
||||
|
||||
/obj/effect/crystalline_reentry/proc/complete_trajectory()
|
||||
//We hit what we wanted to hit, time to go
|
||||
special_target = null
|
||||
destination = get_edge_target_turf(src, dir)
|
||||
walk(src,0)
|
||||
walk_towards(src, destination, 1)
|
||||
//We hit what we wanted to hit, time to go boom!
|
||||
collision_effect()
|
||||
|
||||
/obj/effect/crystalline_reentry/ex_act(severity, target)
|
||||
return 0
|
||||
@@ -147,8 +144,9 @@
|
||||
return
|
||||
|
||||
/obj/effect/crystalline_reentry/Bump(atom/clong)
|
||||
asteroidhealth = asteroidhealth - rand(7,14)
|
||||
|
||||
if(!special_target)//If it has a special target, THERE ARE NO BRAKES ON THE ADMINBUS, BABY
|
||||
asteroidhealth = asteroidhealth - rand(7,14)
|
||||
|
||||
if(prob(10))
|
||||
playsound(src, 'sound/effects/bang.ogg', 50, 1)
|
||||
audible_message("<span class='danger'>You hear a BONK!</span>")
|
||||
@@ -177,19 +175,6 @@
|
||||
qdel(other)
|
||||
if(asteroidhealth <= 0)
|
||||
collision_effect()
|
||||
atmos_spawn_air("water_vapor=1000;TEMP=0") //brr
|
||||
switch(rand(1,100))
|
||||
if(1 to 20)
|
||||
var/obj/structure/spawner/crystalline/M = new(src.loc)
|
||||
visible_message("<span class='danger'>A [M] emerges from the asteroid's rubble!</span>")
|
||||
if(prob(50) && tendrilnotify)
|
||||
priority_announce("Unknown organic entities have been detected in the vincinity of [station_name()]. General caution is advised.", "General Alert")
|
||||
if(21 to 99)
|
||||
visible_message("The asteroid collapses into nothing...")
|
||||
if(100)
|
||||
var/mob/living/simple_animal/bot/hugbot/M = new(src.loc)
|
||||
visible_message("<span class='danger'>A [M] emerges from the asteroid's rubble! Wait... What?</span>")
|
||||
qdel(src)
|
||||
else
|
||||
atmos_spawn_air("water_vapor=75;TEMP=0") //brr
|
||||
|
||||
@@ -198,6 +183,8 @@
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
H.adjustBruteLoss(160)
|
||||
if(special_target && loc == get_turf(special_target)) // just in case. Otherwise the asteroid can stop if it penetrates someone that is standing exactly on that spot and that is bad
|
||||
complete_trajectory()
|
||||
|
||||
/obj/effect/crystalline_reentry/proc/make_debris()
|
||||
for(var/throws = dropamt, throws > 0, throws--)
|
||||
@@ -218,6 +205,19 @@
|
||||
var/dist = get_dist(M.loc, src.loc)
|
||||
shake_camera(M, dist > 20 ? 2 : 4, dist > 20 ? 1 : 3)
|
||||
M.playsound_local(src.loc, null, 50, 1, random_frequency, 10, S = meteor_sound)
|
||||
atmos_spawn_air("water_vapor=1250;TEMP=0") //brr
|
||||
switch(rand(1,100))
|
||||
if(1 to 30)
|
||||
var/obj/structure/spawner/crystalline/M = new(src.loc)
|
||||
visible_message("<span class='danger'>A [M] emerges from the asteroid's rubble!</span>")
|
||||
if(prob(50) && tendrilnotify)
|
||||
priority_announce("Unknown organic entities have been detected in the vincinity of [station_name()]. General caution is advised.", "General Alert")
|
||||
if(31 to 99)
|
||||
visible_message("The asteroid collapses into nothing...")
|
||||
if(100)
|
||||
var/mob/living/simple_animal/bot/hugbot/M = new(src.loc)
|
||||
visible_message("<span class='danger'>A [M] emerges from the asteroid's rubble! Wait... What?</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/crystalline_reentry/notendrilalert
|
||||
tendrilnotify = FALSE
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#define COOLANT_OUTPUT_GATE airs[3]
|
||||
|
||||
#define RBMK_TEMPERATURE_OPERATING 640 //Celsius
|
||||
#define RBMK_TEMPERATURE_CRITICAL 800 //At this point the entire ship/station is alerted to a meltdown. This may need altering
|
||||
#define RBMK_TEMPERATURE_CRITICAL 810 //At this point the entire ship/station is alerted to a meltdown. This may need altering
|
||||
#define RBMK_TEMPERATURE_MELTDOWN 900
|
||||
|
||||
#define RBMK_NO_COOLANT_TOLERANCE 5 //How many process()ing ticks the reactor can sustain without coolant before slowly taking damage
|
||||
@@ -338,8 +338,8 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
|
||||
handle_alerts() //Let's check if they're about to die, and let them know.
|
||||
update_icon()
|
||||
radiation_pulse(src, temperature*radioactivity_spice_multiplier)
|
||||
if(power >= 90 && world.time >= next_flicker) //You're overloading the reactor. Give a more subtle warning that power is getting out of control.
|
||||
next_flicker = world.time + 1.5 MINUTES
|
||||
if(power >= 93 && world.time >= next_flicker) //You're overloading the reactor. Give a more subtle warning that power is getting out of control.
|
||||
next_flicker = world.time + 2 MINUTES
|
||||
for(var/obj/machinery/light/L in GLOB.machines)
|
||||
if(prob(25) && L.z == z) //If youre running the reactor cold though, no need to flicker the lights.
|
||||
L.flicker()
|
||||
@@ -581,6 +581,14 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful
|
||||
. = ..()
|
||||
addtimer(CALLBACK(src, .proc/link_to_reactor), 10 SECONDS)
|
||||
|
||||
/obj/machinery/computer/reactor/wrench_act(mob/living/user, obj/item/I)
|
||||
to_chat(user, "<span class='notice'>You start [anchored ? "un" : ""]securing [name]...</span>")
|
||||
if(I.use_tool(src, user, 40, volume=75))
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [name].</span>")
|
||||
setAnchored(!anchored)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/machinery/computer/reactor/proc/link_to_reactor()
|
||||
for(var/obj/machinery/atmospherics/components/trinary/nuclear_reactor/asdf in GLOB.machines)
|
||||
if(asdf.id && asdf.id == id)
|
||||
|
||||
@@ -9,14 +9,16 @@
|
||||
if(istype(I))
|
||||
to_chat(user, "<span class='notice'>You add the reactor's ID to \the [src]>")
|
||||
src.id = I.buffer
|
||||
link_to_reactor()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/atmospherics/components/trinary/nuclear_reactor/cargo // easier on the brain
|
||||
|
||||
/obj/machinery/atmospherics/components/trinary/nuclear_reactor/cargo/New()
|
||||
id = rand(1, 1000000) // cmon, what are the chances?
|
||||
. = ..()
|
||||
id = rand(1, 9999999) // cmon, what are the chances? The chances are... Very low friend... But maybe we can make this a bit better.
|
||||
|
||||
// Cargo varients can be wrenched down and don't start linked to the default RMBK reactor
|
||||
// Cargo variants can be wrenched down and don't start linked to the default RMBK reactor
|
||||
|
||||
/obj/machinery/computer/reactor/control_rods/cargo
|
||||
anchored = FALSE
|
||||
@@ -29,3 +31,7 @@
|
||||
/obj/machinery/computer/reactor/fuel_rods/cargo
|
||||
anchored = FALSE
|
||||
id = null
|
||||
|
||||
/obj/item/paper/fluff/rbmkcargo
|
||||
name = "Nuclear Reactor Instructions"
|
||||
info = "Make sure a 5x5 area is completely clear of pipes, cables and machinery when using the beacon. Those will be provided automatically with the beacon's bluespace decompression. Use a multitool on the reactor then on the computers provided to link them together. Also make sure the reactor has a proper pipeline filled with cooling gas before inserting fuel rods. Good luck!"
|
||||
|
||||
@@ -6,6 +6,3 @@
|
||||
nutriment_factor = 5 * REAGENTS_METABOLISM
|
||||
metabolization_rate = 1 * REAGENTS_METABOLISM
|
||||
taste_description = "sweetness"
|
||||
|
||||
/datum/reagent/consumable/alienhoney/on_mob_life(mob/living/carbon/M)
|
||||
..()
|
||||
@@ -0,0 +1,29 @@
|
||||
/datum/reagent/medicine/copium
|
||||
name = "copium"
|
||||
description = "A heavy scented substance meant to help one deal with loss."
|
||||
reagent_state = LIQUID
|
||||
color = "#a8707e"
|
||||
overdose_threshold = 21
|
||||
metabolization_rate = 0.75 * REAGENTS_METABOLISM
|
||||
pH = 4
|
||||
|
||||
/datum/reagent/medicine/copium/on_mob_life(mob/living/carbon/M)
|
||||
var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
|
||||
if(mood.sanity <= SANITY_NEUTRAL && current_cycle >= 5)
|
||||
mood.setSanity(min(mood.sanity+5, SANITY_NEUTRAL))
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "copium", /datum/mood_event/copium)
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/copium/overdose_process(mob/living/carbon/M) //copious amounts of copium
|
||||
M.blur_eyes(10)
|
||||
if(prob(50))
|
||||
M.adjustToxLoss(1, 0)
|
||||
if(prob(5))
|
||||
M.say(pick("That's okay. Things are going to be okay.", "This is fine.", "I'm okay with the events that are unfolding currently.", "World of Spacecraft is still a good game...", "I'm winning.", "Diesels are far more powerful."))
|
||||
if(prob(5))
|
||||
M.emote("me", 1, "seems to be crying.")
|
||||
if(prob(4))
|
||||
M.emote("me", 1, "falls over, crying.")
|
||||
M.Knockdown(40)
|
||||
|
||||
//To-do: /datum/reagent/medicine/seethium
|
||||
@@ -0,0 +1,6 @@
|
||||
/datum/chemical_reaction/copium
|
||||
name = "copium"
|
||||
id = /datum/reagent/medicine/copium
|
||||
results = list(/datum/reagent/medicine/copium = 5)
|
||||
required_reagents = list(/datum/reagent/medicine/mannitol = 2, /datum/reagent/water = 1, /datum/reagent/medicine/epinephrine = 1, /datum/reagent/consumable/sugar = 1)
|
||||
required_temp = 266
|
||||
@@ -49,7 +49,7 @@ mob/living/get_effective_size()
|
||||
src.update_mobsize()
|
||||
//Going to change the health and speed values too
|
||||
src.remove_movespeed_modifier(MOVESPEED_ID_SIZE)
|
||||
src.add_movespeed_modifier(MOVESPEED_ID_SIZE, multiplicative_slowdown = (abs(size_multiplier - 1) * 0.8 ))
|
||||
src.add_movespeed_modifier(MOVESPEED_ID_SIZE, multiplicative_slowdown = (abs(size_multiplier - 1) * 0.4 ))
|
||||
var/healthmod_old = ((previous_size * 75) - 75) //Get the old value to see what we must change.
|
||||
var/healthmod_new = ((size_multiplier * 75) - 75) //A size of one would be zero. Big boys get health, small ones lose health.
|
||||
var/healthchange = healthmod_new - healthmod_old //Get ready to apply the new value, and subtract the old one. (Negative values become positive)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
flag = "laser"
|
||||
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
|
||||
|
||||
//TO DO: make the size ray have a selection of a minimum size and maximum size, rather than two modes.
|
||||
/obj/item/projectile/sizelaser/shrinkray
|
||||
icon_state="bluelaser"
|
||||
|
||||
@@ -66,8 +67,9 @@
|
||||
//Gun
|
||||
/obj/item/gun/energy/laser/sizeray
|
||||
name = "size ray"
|
||||
icon_state = "bluetag"
|
||||
desc = "Debug size manipulator. You probably shouldn't have this!"
|
||||
icon = 'icons/obj/guns/energy.dmi'
|
||||
icon_state = "sizeshrink"
|
||||
desc = "An extremely-dangerous, almost-illegal size-altering device. You've either stolen this, or have the permits for it."
|
||||
item_state = null
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser/shrinkray, /obj/item/ammo_casing/energy/laser/growthray)
|
||||
selfcharge = EGUN_SELFCHARGE
|
||||
@@ -77,10 +79,10 @@
|
||||
|
||||
attackby(obj/item/W, mob/user)
|
||||
if(W==src)
|
||||
if(icon_state=="bluetag")
|
||||
icon_state="redtag"
|
||||
if(icon_state=="sizeshrink")
|
||||
icon_state="sizegrow"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser/growthray)
|
||||
else
|
||||
icon_state="bluetag"
|
||||
icon_state="sizeshrink"
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/laser/shrinkray)
|
||||
return ..()
|
||||
|
||||
@@ -164,6 +164,13 @@
|
||||
C.adjustArousalLoss(20)
|
||||
M.adjustArousalLoss(20)
|
||||
M.do_jitter_animation() //make your partner shake too!
|
||||
|
||||
if (M.getArousalLoss() >= 100 && ishuman(M) && prob(5))//Why not have a probability to cum when someone's getting nailed with max arousal?~
|
||||
if(V.is_exposed()) //Oh yea, if vagina is not exposed, the climax will not cause a spill
|
||||
M.mob_climax_outside(V, spillage = TRUE)
|
||||
else
|
||||
M.mob_climax_outside(V, spillage = FALSE)
|
||||
|
||||
if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna())
|
||||
var/mob/living/carbon/human/O = C
|
||||
|
||||
|
||||
Reference in New Issue
Block a user