and finally, the modules folder. Now I can publish and take a break
This commit is contained in:
@@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
/datum/antagonist/proc/is_banned(mob/M)
|
||||
if(!M)
|
||||
return FALSE
|
||||
. = (jobban_isbanned(M, ROLE_SYNDICATE) || (job_rank && jobban_isbanned(M,job_rank)))
|
||||
. = (jobban_isbanned(M, ROLE_SYNDICATE) || QDELETED(M) || (job_rank && (jobban_isbanned(M,job_rank) || QDELETED(M))))
|
||||
|
||||
/datum/antagonist/proc/replace_banned_player()
|
||||
set waitfor = FALSE
|
||||
@@ -110,12 +110,12 @@ GLOBAL_LIST_EMPTY(antagonists)
|
||||
/datum/antagonist/proc/give_antag_moodies()
|
||||
if(!antag_moodlet)
|
||||
return
|
||||
owner.current.SendSignal(COMSIG_ADD_MOOD_EVENT, "antag_moodlet", antag_moodlet)
|
||||
SEND_SIGNAL(owner.current, COMSIG_ADD_MOOD_EVENT, "antag_moodlet", antag_moodlet)
|
||||
|
||||
/datum/antagonist/proc/clear_antag_moodies()
|
||||
if(!antag_moodlet)
|
||||
return
|
||||
owner.current.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "antag_moodlet")
|
||||
SEND_SIGNAL(owner.current, COMSIG_CLEAR_MOOD_EVENT, "antag_moodlet")
|
||||
|
||||
//Returns the team antagonist belongs to if any.
|
||||
/datum/antagonist/proc/get_team()
|
||||
|
||||
@@ -58,6 +58,8 @@
|
||||
return
|
||||
var/list/candidates = pollCandidatesForMob("Do you want to play as a wizard's [href_list["school"]] apprentice?", ROLE_WIZARD, null, ROLE_WIZARD, 150, src)
|
||||
if(LAZYLEN(candidates))
|
||||
if(QDELETED(src))
|
||||
return
|
||||
if(used)
|
||||
to_chat(H, "You already used this contract!")
|
||||
return
|
||||
@@ -121,7 +123,7 @@
|
||||
to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>")
|
||||
var/list/nuke_candidates = pollGhostCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg":"operative"]?", ROLE_OPERATIVE, null, ROLE_OPERATIVE, 150, POLL_IGNORE_SYNDICATE)
|
||||
if(LAZYLEN(nuke_candidates))
|
||||
if(!(check_usability(user)))
|
||||
if(QDELETED(src) || !check_usability(user))
|
||||
return
|
||||
used = TRUE
|
||||
var/mob/dead/observer/G = pick(nuke_candidates)
|
||||
@@ -235,7 +237,7 @@
|
||||
return
|
||||
var/list/candidates = pollCandidatesForMob("Do you want to play as a [initial(demon_type.name)]?", ROLE_ALIEN, null, ROLE_ALIEN, 50, src)
|
||||
if(LAZYLEN(candidates))
|
||||
if(used)
|
||||
if(used || QDELETED(src))
|
||||
return
|
||||
used = TRUE
|
||||
var/mob/dead/observer/C = pick(candidates)
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
var/combat_armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 90, "acid" = 90)
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop()
|
||||
flags_1 ^= NODROP_1
|
||||
item_flags ^= NODROP
|
||||
if(ismob(loc))
|
||||
to_chat(loc, "<span class='notice'>Your vest is now [flags_1 & NODROP_1 ? "locked" : "unlocked"].</span>")
|
||||
to_chat(loc, "<span class='notice'>Your vest is now [item_flags & NODROP ? "locked" : "unlocked"].</span>")
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode()
|
||||
switch(mode)
|
||||
@@ -589,9 +589,10 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
breakouttime = 450
|
||||
trashtype = /obj/item/restraints/handcuffs/energy/used
|
||||
flags_1 = NONE
|
||||
|
||||
/obj/item/restraints/handcuffs/energy/used
|
||||
flags_1 = DROPDEL_1
|
||||
item_flags = DROPDEL
|
||||
|
||||
/obj/item/restraints/handcuffs/energy/used/dropped(mob/user)
|
||||
user.visible_message("<span class='danger'>[user]'s [name] breaks in a discharge of energy!</span>", \
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H
|
||||
if(V)
|
||||
console.AddVest(V)
|
||||
V.flags_1 |= NODROP_1
|
||||
V.item_flags |= NODROP
|
||||
|
||||
var/obj/item/storage/backpack/B = locate() in H
|
||||
if(B)
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
|
||||
dat+="<br>"
|
||||
dat += "<a href='?src=[REF(src)];select_disguise=1'>Select Agent Vest Disguise</a><br>"
|
||||
dat += "<a href='?src=[REF(src)];toggle_vest=1'>[vest.flags_1 & NODROP_1 ? "Unlock" : "Lock"] Vest</a><br>"
|
||||
dat += "<a href='?src=[REF(src)];toggle_vest=1'>[vest.item_flags & NODROP ? "Unlock" : "Lock"] Vest</a><br>"
|
||||
else
|
||||
dat += "<span class='bad'>NO AGENT VEST DETECTED</span>"
|
||||
var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500)
|
||||
|
||||
@@ -123,7 +123,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
else
|
||||
L.fully_heal()
|
||||
|
||||
for(var/V in GLOB.sortedAreas)
|
||||
for(var/V in GLOB.the_station_areas)
|
||||
var/area/A = V
|
||||
if(!A.blob_allowed)
|
||||
continue
|
||||
|
||||
@@ -451,7 +451,7 @@
|
||||
/datum/antagonist/changeling/proc/update_changeling_icons_added()
|
||||
var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_CHANGELING]
|
||||
hud.join_hud(owner.current)
|
||||
set_antag_hud(owner.current, "changling")
|
||||
set_antag_hud(owner.current, "changeling")
|
||||
|
||||
/datum/antagonist/changeling/proc/update_changeling_icons_removed()
|
||||
var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_CHANGELING]
|
||||
|
||||
@@ -112,10 +112,3 @@
|
||||
target.death(0)
|
||||
target.Drain()
|
||||
return TRUE
|
||||
|
||||
|
||||
|
||||
//Absorbs the target DNA.
|
||||
//datum/changeling/proc/absorb_dna(mob/living/carbon/T, mob/user)
|
||||
|
||||
//datum/changeling/proc/store_dna(datum/dna/new_dna, mob/user)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Augmented Eyesight: Gives you x-ray vision or protection from flashes. Also, high DNA cost because of how powerful it is.
|
||||
//Augmented Eyesight: Gives you X-ray vision or protection from flashes. Also, high DNA cost because of how powerful it is.
|
||||
//Possible todo: make a custom message for directing a penlight/flashlight at the eyes - not sure what would display though.
|
||||
|
||||
/obj/effect/proc_holder/changeling/augmented_eyesight
|
||||
@@ -41,7 +41,7 @@
|
||||
return 1
|
||||
|
||||
|
||||
/obj/effect/proc_holder/changeling/augmented_eyesight/on_refund(mob/user) //Get rid of x-ray vision and flash protection when the user refunds this ability
|
||||
/obj/effect/proc_holder/changeling/augmented_eyesight/on_refund(mob/user) //Get rid of X-ray vision and flash protection when the user refunds this ability
|
||||
var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES)
|
||||
if(E)
|
||||
if (active)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/effect/proc_holder/changeling/digitalcamo
|
||||
name = "Digital Camouflage"
|
||||
desc = "By evolving the ability to distort our form and proprotions, we defeat common altgorithms used to detect lifeforms on cameras."
|
||||
desc = "By evolving the ability to distort our form and proportions, we defeat common algorithms used to detect lifeforms on cameras."
|
||||
helptext = "We cannot be tracked by camera or seen by AI units while using this skill. However, humans looking at us will find us... uncanny."
|
||||
dna_cost = 1
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
/obj/effect/proc_holder/changeling/weapon/proc/check_weapon(mob/user, obj/item/hand_item)
|
||||
if(istype(hand_item, weapon_type))
|
||||
user.temporarilyRemoveItemFromInventory(hand_item, TRUE) //DROPDEL_1 will delete the item
|
||||
user.temporarilyRemoveItemFromInventory(hand_item, TRUE) //DROPDEL will delete the item
|
||||
if(!silent)
|
||||
playsound(user, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
user.visible_message("<span class='warning'>With a sickening crunch, [user] reforms [user.p_their()] [weapon_name_simple] into an arm!</span>", "<span class='notice'>We assimilate the [weapon_name_simple] back into our body.</span>", "<span class='italics>You hear organic matter ripping and tearing!</span>")
|
||||
@@ -149,7 +149,7 @@
|
||||
item_state = "arm_blade"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
||||
flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1
|
||||
item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
force = 25
|
||||
throwforce = 0 //Just to be on the safe side
|
||||
@@ -229,7 +229,8 @@
|
||||
item_state = "tentacle"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
||||
flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1 | NOBLUDGEON_1
|
||||
item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL | NOBLUDGEON
|
||||
flags_1 = NONE
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
ammo_type = /obj/item/ammo_casing/magic/tentacle
|
||||
fire_sound = 'sound/effects/splat.ogg'
|
||||
@@ -397,7 +398,7 @@
|
||||
/obj/item/shield/changeling
|
||||
name = "shield-like mass"
|
||||
desc = "A mass of tough, boney tissue. You can still see the fingers as a twisted pattern in the shield."
|
||||
flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1
|
||||
item_flags = ABSTRACT | NODROP | DROPDEL
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "ling_shield"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
@@ -445,7 +446,7 @@
|
||||
name = "flesh mass"
|
||||
icon_state = "lingspacesuit"
|
||||
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
|
||||
flags_1 = NODROP_1 | DROPDEL_1
|
||||
item_flags = NODROP | DROPDEL
|
||||
clothing_flags = STOPSPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) //No armor at all.
|
||||
@@ -465,7 +466,7 @@
|
||||
name = "flesh mass"
|
||||
icon_state = "lingspacehelmet"
|
||||
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
|
||||
flags_1 = NODROP_1 | DROPDEL_1
|
||||
item_flags = NODROP | DROPDEL
|
||||
clothing_flags = STOPSPRESSUREDAMAGE
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
@@ -491,7 +492,7 @@
|
||||
name = "chitinous mass"
|
||||
desc = "A tough, hard covering of black chitin."
|
||||
icon_state = "lingarmor"
|
||||
flags_1 = NODROP_1 | DROPDEL_1
|
||||
item_flags = NODROP | DROPDEL
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
@@ -507,6 +508,6 @@
|
||||
name = "chitinous mass"
|
||||
desc = "A tough, hard covering of black chitin with transparent chitin in front."
|
||||
icon_state = "lingarmorhelmet"
|
||||
flags_1 = NODROP_1 | DROPDEL_1
|
||||
item_flags = NODROP | DROPDEL
|
||||
armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 20, "bomb" = 10, "bio" = 4, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
#define CHANGELING_PHEROMONE_MIN_DISTANCE 10 //More generous than the agent pinpointer because you don't know who you're looking for.
|
||||
#define CHANGELING_PHEROMONE_MAX_DISTANCE 25 //They can smell your fear a mile away. Well, 50 meters.
|
||||
#define CHANGELING_PHEROMONE_PING_TIME 20 //2s update time.
|
||||
|
||||
|
||||
/obj/effect/proc_holder/changeling/pheromone_receptors
|
||||
name = "Pheromone Receptors"
|
||||
desc = "We attune our senses to track other changelings by scent. The closer they are, the easier we can find them."
|
||||
helptext = "We will know the general direction of nearby changelings, with closer scents being stronger. Our chemical generation is slowed while this is active."
|
||||
chemical_cost = 0 //Reduces regain rate while active.
|
||||
dna_cost = 2
|
||||
var/receptors_active = FALSE
|
||||
|
||||
/obj/effect/proc_holder/changeling/pheromone_receptors/sting_action(mob/living/carbon/user)
|
||||
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
if(!receptors_active)
|
||||
to_chat(user, "<span class='warning'>We search for the scent of any nearby changelings.</span>")
|
||||
changeling.chem_recharge_slowdown += 0.5
|
||||
user.apply_status_effect(/datum/status_effect/agent_pinpointer/changeling)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>We stop searching for now.</span>")
|
||||
changeling.chem_recharge_slowdown -= 0.5
|
||||
user.remove_status_effect(/datum/status_effect/agent_pinpointer/changeling)
|
||||
|
||||
receptors_active = !receptors_active
|
||||
|
||||
//Modified IA pinpointer - Points to the NEAREST changeling, but will only get you within a few tiles of the target.
|
||||
//You'll still have to rely on intuition and observation to make the identification. Lings can 'hide' in public places.
|
||||
/datum/status_effect/agent_pinpointer/changeling
|
||||
alert_type = /obj/screen/alert/status_effect/agent_pinpointer/changeling
|
||||
minimum_range = CHANGELING_PHEROMONE_MIN_DISTANCE
|
||||
tick_interval = CHANGELING_PHEROMONE_PING_TIME
|
||||
range_fuzz_factor = 0
|
||||
|
||||
/datum/status_effect/agent_pinpointer/changeling/scan_for_target()
|
||||
var/turf/my_loc = get_turf(owner)
|
||||
|
||||
var/list/mob/living/carbon/changelings = list()
|
||||
|
||||
for(var/mob/living/carbon/C in GLOB.alive_mob_list)
|
||||
if(C != owner && C.mind)
|
||||
var/datum/antagonist/changeling/antag_datum = C.mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
if(istype(antag_datum))
|
||||
var/their_loc = get_turf(C)
|
||||
var/distance = get_dist_euclidian(my_loc, their_loc)
|
||||
if (distance < CHANGELING_PHEROMONE_MAX_DISTANCE)
|
||||
changelings[C] = (CHANGELING_PHEROMONE_MAX_DISTANCE ** 2) - (distance ** 2)
|
||||
|
||||
if(changelings.len)
|
||||
scan_target = pickweight(changelings) //Point at a 'random' changeling, biasing heavily towards closer ones.
|
||||
else
|
||||
scan_target = null
|
||||
|
||||
|
||||
/obj/screen/alert/status_effect/agent_pinpointer/changeling
|
||||
name = "Pheromone Scent"
|
||||
desc = "The nose always knows."
|
||||
@@ -134,7 +134,7 @@
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/false_armblade/sting_action(mob/user, mob/target)
|
||||
add_logs(user, target, "stung", object="falso armblade sting")
|
||||
add_logs(user, target, "stung", object="false armblade sting")
|
||||
|
||||
var/obj/item/held = target.get_active_held_item()
|
||||
if(held && !target.dropItemToGround(held))
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
/obj/item/clothing/glasses/changeling
|
||||
name = "flesh"
|
||||
flags_1 = NODROP_1
|
||||
item_flags = NODROP
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/clothing/glasses/changeling/attack_hand(mob/user)
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
/obj/item/clothing/under/changeling
|
||||
name = "flesh"
|
||||
flags_1 = NODROP_1
|
||||
item_flags = NODROP
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/clothing/under/changeling/attack_hand(mob/user)
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
/obj/item/clothing/suit/changeling
|
||||
name = "flesh"
|
||||
flags_1 = NODROP_1
|
||||
item_flags = NODROP
|
||||
allowed = list(/obj/item/changeling)
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
/obj/item/clothing/head/changeling
|
||||
name = "flesh"
|
||||
flags_1 = NODROP_1
|
||||
item_flags = NODROP
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/clothing/head/changeling/attack_hand(mob/user)
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
/obj/item/clothing/shoes/changeling
|
||||
name = "flesh"
|
||||
flags_1 = NODROP_1
|
||||
item_flags = NODROP
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/clothing/shoes/changeling/attack_hand(mob/user)
|
||||
@@ -69,7 +69,7 @@
|
||||
|
||||
/obj/item/clothing/gloves/changeling
|
||||
name = "flesh"
|
||||
flags_1 = NODROP_1
|
||||
item_flags = NODROP
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/clothing/gloves/changeling/attack_hand(mob/user)
|
||||
@@ -81,7 +81,7 @@
|
||||
|
||||
/obj/item/clothing/mask/changeling
|
||||
name = "flesh"
|
||||
flags_1 = NODROP_1
|
||||
item_flags = NODROP
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
/obj/item/clothing/mask/changeling/attack_hand(mob/user)
|
||||
@@ -93,7 +93,7 @@
|
||||
|
||||
/obj/item/changeling
|
||||
name = "flesh"
|
||||
flags_1 = NODROP_1
|
||||
item_flags = NODROP
|
||||
slot_flags = ALL
|
||||
allowed = list(/obj/item/changeling)
|
||||
|
||||
|
||||
@@ -254,8 +254,8 @@
|
||||
var/list/repair_values = list()
|
||||
if(!fabricator.fabricator_repair_checks(repair_values, src, user))
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user]'s [fabricator.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...</span>", \
|
||||
"<span class='alloy'>You start repairin[src == user ? "g yourself" : "g [src]"]...</span>")
|
||||
user.visible_message("<span class='notice'>[user]'s [fabricator.name] starts covering [src == user ? "[user.p_them()]" : "[src]"] in glowing orange energy...</span>", \
|
||||
"<span class='alloy'>You start repairing [src == user ? "yourself" : "[src]"]...</span>")
|
||||
fabricator.repairing = src
|
||||
while(fabricator && user && src)
|
||||
if(!do_after(user, repair_values["healing_for_cycle"] * fabricator.speed_multiplier, target = src, \
|
||||
@@ -283,7 +283,7 @@
|
||||
if(health == maxHealth) //if we're at maximum health, replace the turf under us
|
||||
return FALSE
|
||||
else if(fabricator_heal(user, fabricator) && user)
|
||||
user.visible_message("<span class='notice'>[user]'s [fabricator.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.</span>", \
|
||||
user.visible_message("<span class='notice'>[user]'s [fabricator.name] stops covering [src == user ? "[user.p_them()]" : "[src]"] with glowing orange energy.</span>", \
|
||||
"<span class='alloy'>You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_theyre(TRUE)]"] now at <b>[abs(HEALTH_THRESHOLD_DEAD - health)]/[abs(HEALTH_THRESHOLD_DEAD - maxHealth)]</b> health.</span>")
|
||||
|
||||
//Same with clockwork mobs.
|
||||
@@ -292,7 +292,7 @@
|
||||
if(health == maxHealth) //if we're at maximum health, replace the turf under us
|
||||
return FALSE
|
||||
else if(fabricator_heal(user, fabricator) && user)
|
||||
user.visible_message("<span class='notice'>[user]'s [fabricator.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.</span>", \
|
||||
user.visible_message("<span class='notice'>[user]'s [fabricator.name] stops covering [src == user ? "[user.p_them()]" : "[src]"] with glowing orange energy.</span>", \
|
||||
"<span class='alloy'>You finish repairin[src == user ? "g yourself. You are":"g [src]. [p_theyre(TRUE)]"] now at <b>[health]/[maxHealth]</b> health.</span>")
|
||||
|
||||
//Cogscarabs get special interaction because they're drones and have innate self-heals/revives.
|
||||
@@ -304,13 +304,13 @@
|
||||
if(health == maxHealth)
|
||||
return FALSE
|
||||
else if(!(flags_1 & GODMODE))
|
||||
user.visible_message("<span class='notice'>[user]'s [fabricator.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...</span>", \
|
||||
"<span class='alloy'>You start repairin[src == user ? "g yourself" : "g [src]"]...</span>")
|
||||
user.visible_message("<span class='notice'>[user]'s [fabricator.name] starts covering [src == user ? "[user.p_them()]" : "[src]"] in glowing orange energy...</span>", \
|
||||
"<span class='alloy'>You start repairing [src == user ? "yourself" : "[src]"]...</span>")
|
||||
fabricator.repairing = src
|
||||
if(do_after(user, (maxHealth - health)*2, target=src))
|
||||
adjustHealth(-maxHealth)
|
||||
user.visible_message("<span class='notice'>[user]'s [fabricator.name] stops coverin[src == user ? "g [user.p_them()]" : "g [src]"] with glowing orange energy.</span>", \
|
||||
"<span class='alloy'>You finish repairin[src == user ? "g yourself" : "g [src]"].</span>")
|
||||
user.visible_message("<span class='notice'>[user]'s [fabricator.name] stops covering [src == user ? "[user.p_them()]" : "[src]"] with glowing orange energy.</span>", \
|
||||
"<span class='alloy'>You finish repairing [src == user ? "yourself" : "[src]"].</span>")
|
||||
if(fabricator)
|
||||
fabricator.repairing = null
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
name = "replicant manacles"
|
||||
desc = "Heavy manacles made out of freezing-cold metal. It looks like brass, but feels much more solid."
|
||||
icon_state = "brass_manacles"
|
||||
flags_1 = DROPDEL_1
|
||||
item_flags = DROPDEL
|
||||
|
||||
/obj/item/restraints/handcuffs/clockwork/dropped(mob/user)
|
||||
user.visible_message("<span class='danger'>[user]'s [name] come apart at the seams!</span>", \
|
||||
|
||||
@@ -106,13 +106,13 @@
|
||||
if(slot == SLOT_WEAR_SUIT && !is_servant_of_ratvar(user))
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "<span class='heavy_brass'>\"Now now, this is for my servants, not you.\"</span>")
|
||||
user.visible_message("<span class='warning'>As [user] puts [src] on, it flickers off [user.p_their()] body!</span>", "<span class='warning'>The curiass flickers off your body, leaving only nausea!</span>")
|
||||
user.visible_message("<span class='warning'>As [user] puts [src] on, it flickers off [user.p_their()] body!</span>", "<span class='warning'>The cuirass flickers off your body, leaving only nausea!</span>")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.vomit(20)
|
||||
else
|
||||
to_chat(user, "<span class='heavy_brass'>\"I think this armor is too hot for you to handle.\"</span>")
|
||||
to_chat(user, "<span class='userdanger'>The curiass emits a burst of flame as you scramble to get it off!</span>")
|
||||
to_chat(user, "<span class='userdanger'>The cuirass emits a burst of flame as you scramble to get it off!</span>")
|
||||
user.emote("scream")
|
||||
user.apply_damage(15, BURN, BODY_ZONE_CHEST)
|
||||
user.adjust_fire_stacks(2)
|
||||
|
||||
@@ -278,7 +278,7 @@
|
||||
dat += "<font color=#BE8700 size=3>Items</font><br>"
|
||||
dat += "<font color=#BE8700><b>Slab:</b></font> A clockwork slab, a Servant's most important tool. You're holding one! Keep it safe and hidden.<br>"
|
||||
dat += "<font color=#BE8700><b>Visor:</b></font> A judicial visor, which is a pair of glasses that can smite an area for a brief stun and delayed explosion.<br>"
|
||||
dat += "<font color=#BE8700><b>Wraith Specs:</b></font> Wraith spectacles, which provide true sight (x-ray, night vision) but damage the wearer's eyes.<br>"
|
||||
dat += "<font color=#BE8700><b>Wraith Specs:</b></font> Wraith spectacles, which provide true sight (X-ray, night vision) but damage the wearer's eyes.<br>"
|
||||
dat += "<font color=#BE8700><b>Spear:</b></font> A Ratvarian spear, which is a very powerful melee weapon that produces Vitality.<br>"
|
||||
dat += "<font color=#BE8700><b>Fabricator:</b></font> A replica fabricator, which converts objects into clockwork versions.<br><br>"
|
||||
dat += "<font color=#BE8700 size=3>Constructs</font><br>"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<span class='brass'>Siphons <b>5 W</b> of power per second while in an APC.</span>"
|
||||
icon_state = "wall_gear"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
flags_1 = NOBLUDGEON_1
|
||||
item_flags = NOBLUDGEON
|
||||
var/obj/machinery/power/apc/apc
|
||||
|
||||
/obj/item/clockwork/integration_cog/Initialize()
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
force = 5
|
||||
flags_1 = NOBLUDGEON_1
|
||||
item_flags = NOBLUDGEON
|
||||
var/speed_multiplier = 1 //The speed ratio the fabricator operates at
|
||||
var/uses_power = TRUE
|
||||
var/repairing = null //what we're currently repairing, if anything
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Wraith spectacles: Grants x-ray and night vision at the eventual cost of the wearer's sight if worn too long. Nar-Sian cultists are instantly blinded.
|
||||
//Wraith spectacles: Grants X-ray and night vision at the eventual cost of the wearer's sight if worn too long. Nar-Sian cultists are instantly blinded.
|
||||
/obj/item/clothing/glasses/wraith_spectacles
|
||||
name = "antique spectacles"
|
||||
desc = "Unnerving glasses with opaque yellow lenses."
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
descname = "Trap, Stunning"
|
||||
name = "Sigil of Transgression"
|
||||
desc = "Wards a tile with a sigil, which will briefly stun the next non-Servant to cross it and apply Belligerent to them."
|
||||
invocations = list("Divinity, smite...", "...those who tresspass here!")
|
||||
invocations = list("Divinity, smite...", "...those who trespass here!")
|
||||
channel_time = 50
|
||||
power_cost = 50
|
||||
whispered = TRUE
|
||||
|
||||
@@ -339,7 +339,8 @@
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "disintegrate"
|
||||
item_state = null
|
||||
flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1
|
||||
item_flags = NEEDS_PERMIT | ABSTRACT | NODROP | DROPDEL
|
||||
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
throwforce = 0
|
||||
throw_range = 0
|
||||
@@ -519,7 +520,7 @@
|
||||
name = "shadow shackles"
|
||||
desc = "Shackles that bind the wrists with sinister magic."
|
||||
trashtype = /obj/item/restraints/handcuffs/energy/used
|
||||
flags_1 = DROPDEL_1
|
||||
item_flags = DROPDEL
|
||||
|
||||
/obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user)
|
||||
user.visible_message("<span class='danger'>[user]'s shackles shatter in a discharge of dark magic!</span>", \
|
||||
@@ -541,7 +542,7 @@
|
||||
var/obj/item/stack/sheet/candidate = target
|
||||
if(candidate.use(50))
|
||||
uses--
|
||||
to_chat(user, "<span class='warning'>A dark cloud eminates from your hand and swirls around the metal, twisting it into a construct shell!</span>")
|
||||
to_chat(user, "<span class='warning'>A dark cloud emanates from your hand and swirls around the metal, twisting it into a construct shell!</span>")
|
||||
new /obj/structure/constructshell(T)
|
||||
SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
|
||||
else
|
||||
@@ -552,12 +553,12 @@
|
||||
if(candidate.use(quantity))
|
||||
uses --
|
||||
new /obj/item/stack/sheet/runed_metal(T,quantity)
|
||||
to_chat(user, "<span class='warning'>A dark cloud eminates from you hand and swirls around the plasteel, transforming it into runed metal!</span>")
|
||||
to_chat(user, "<span class='warning'>A dark cloud emanates from you hand and swirls around the plasteel, transforming it into runed metal!</span>")
|
||||
SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
|
||||
else if(istype(target,/mob/living/silicon/robot))
|
||||
var/mob/living/silicon/robot/candidate = target
|
||||
if(candidate.mmi)
|
||||
user.visible_message("<span class='danger'>A dark cloud eminates from [user]'s hand and swirls around [candidate]!</span>")
|
||||
user.visible_message("<span class='danger'>A dark cloud emanates from [user]'s hand and swirls around [candidate]!</span>")
|
||||
playsound(T, 'sound/machines/airlock_alien_prying.ogg', 80, 1)
|
||||
var/prev_color = candidate.color
|
||||
candidate.color = "black"
|
||||
@@ -580,7 +581,7 @@
|
||||
candidate.color = prev_color
|
||||
else
|
||||
uses--
|
||||
to_chat(user, "<span class='warning'>A dark cloud eminates from you hand and swirls around [candidate] - twisting it into a construct shell!</span>")
|
||||
to_chat(user, "<span class='warning'>A dark cloud emanates from you hand and swirls around [candidate] - twisting it into a construct shell!</span>")
|
||||
new /obj/structure/constructshell(T)
|
||||
SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
|
||||
else if(istype(target,/obj/machinery/door/airlock))
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
else
|
||||
to_chat(mob, "<span class='danger'>You have a [item_name] in your [where].</span>")
|
||||
if(where == "backpack")
|
||||
mob.back.SendSignal(COMSIG_TRY_STORAGE_SHOW, mob)
|
||||
SEND_SIGNAL(mob.back, COMSIG_TRY_STORAGE_SHOW, mob)
|
||||
return TRUE
|
||||
|
||||
/datum/antagonist/cult/apply_innate_effects(mob/living/mob_override)
|
||||
@@ -228,7 +228,7 @@
|
||||
target_candidates += player.mind
|
||||
|
||||
if(target_candidates.len == 0)
|
||||
message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.")
|
||||
message_admins("Cult Sacrifice: Could not find unconvertible target, checking for convertible target.")
|
||||
for(var/mob/living/carbon/human/player in GLOB.player_list)
|
||||
if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD)
|
||||
target_candidates += player.mind
|
||||
@@ -248,7 +248,7 @@
|
||||
|
||||
objectives += sac_objective
|
||||
else
|
||||
message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!")
|
||||
message_admins("Cult Sacrifice: Could not find unconvertible or convertible target. WELP!")
|
||||
|
||||
|
||||
//SUMMON OBJECTIVE
|
||||
|
||||
@@ -64,7 +64,8 @@
|
||||
/obj/item/melee/cultblade/ghost
|
||||
name = "eldritch sword"
|
||||
force = 19 //can't break normal airlocks
|
||||
flags_1 = NODROP_1|DROPDEL_1
|
||||
item_flags = NEEDS_PERMIT | NODROP | DROPDEL
|
||||
flags_1 = NONE
|
||||
|
||||
/obj/item/melee/cultblade/pickup(mob/living/user)
|
||||
..()
|
||||
@@ -301,7 +302,7 @@
|
||||
item_state = "cult_hoodalt"
|
||||
|
||||
/obj/item/clothing/head/culthood/alt/ghost
|
||||
flags_1 = NODROP_1|DROPDEL_1
|
||||
item_flags = NODROP | DROPDEL
|
||||
|
||||
/obj/item/clothing/suit/cultrobes/alt
|
||||
name = "cultist robes"
|
||||
@@ -310,7 +311,7 @@
|
||||
item_state = "cultrobesalt"
|
||||
|
||||
/obj/item/clothing/suit/cultrobes/alt/ghost
|
||||
flags_1 = NODROP_1|DROPDEL_1
|
||||
item_flags = NODROP | DROPDEL
|
||||
|
||||
|
||||
/obj/item/clothing/head/magus
|
||||
@@ -333,7 +334,7 @@
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/cult
|
||||
name = "nar-sien hardened helmet"
|
||||
name = "\improper Nar-Sien hardened helmet"
|
||||
desc = "A heavily-armored helmet worn by warriors of the Nar-Sien cult. It can withstand hard vacuum."
|
||||
icon_state = "cult_helmet"
|
||||
item_state = "cult_helmet"
|
||||
@@ -342,7 +343,7 @@
|
||||
actions_types = list()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/cult
|
||||
name = "nar-sien hardened armor"
|
||||
name = "\improper Nar-Sien hardened armor"
|
||||
icon_state = "cult_armor"
|
||||
item_state = "cult_armor"
|
||||
desc = "A heavily-armored exosuit worn by warriors of the Nar-Sien cult. It can withstand hard vacuum."
|
||||
@@ -754,7 +755,7 @@
|
||||
guns_left = 24
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood
|
||||
fire_sound = 'sound/magic/wand_teleport.ogg'
|
||||
flags_1 = NOBLUDGEON_1 | DROPDEL_1
|
||||
item_flags = NEEDS_PERMIT | NOBLUDGEON | DROPDEL
|
||||
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/boltaction/enchanted/arcane_barrage/blood
|
||||
@@ -792,7 +793,7 @@
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "disintegrate"
|
||||
item_state = null
|
||||
flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1
|
||||
item_flags = ABSTRACT | NODROP | DROPDEL
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
throwforce = 0
|
||||
throw_range = 0
|
||||
|
||||
@@ -804,7 +804,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
construct_invoke = FALSE
|
||||
color = RUNE_COLOR_DARKRED
|
||||
var/mob/living/affecting = null
|
||||
var/ghost_limit = 4
|
||||
var/ghost_limit = 3
|
||||
var/ghosts = 0
|
||||
|
||||
/obj/effect/rune/manifest/Initialize()
|
||||
@@ -834,10 +834,15 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
if(A.map_name == "Space" || is_mining_level(T.z))
|
||||
to_chat(user, "<span class='cultitalic'><b>The veil is not weak enough here to manifest spirits, you must be on station!</b></span>")
|
||||
return
|
||||
if(ghosts >= ghost_limit)
|
||||
to_chat(user, "<span class='cultitalic'>You are sustaining too many ghosts to summon more!</span>")
|
||||
fail_invoke()
|
||||
log_game("Manifest rune failed - too many summoned ghosts")
|
||||
return list()
|
||||
notify_ghosts("Manifest rune invoked in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src)
|
||||
var/list/ghosts_on_rune = list()
|
||||
for(var/mob/dead/observer/O in T)
|
||||
if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
|
||||
if(O.client && !jobban_isbanned(O, ROLE_CULTIST) && !QDELETED(src) && !QDELETED(O))
|
||||
ghosts_on_rune += O
|
||||
if(!ghosts_on_rune.len)
|
||||
to_chat(user, "<span class='cultitalic'>There are no spirits near [src]!</span>")
|
||||
@@ -852,11 +857,6 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
new_human.apply_status_effect(STATUS_EFFECT_SUMMONEDGHOST) //ghosts can't summon more ghosts
|
||||
new_human.see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
ghosts++
|
||||
if(ghosts >= ghost_limit)
|
||||
to_chat(user, "<span class='cultitalic'>You are sustaining too many ghosts to summon more!</span>")
|
||||
fail_invoke()
|
||||
log_game("Manifest rune failed - too many summoned ghosts")
|
||||
return list()
|
||||
playsound(src, 'sound/magic/exit_blood.ogg', 50, 1)
|
||||
visible_message("<span class='warning'>A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.</span>")
|
||||
to_chat(user, "<span class='cultitalic'>Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...</span>")
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
var/boost = 0
|
||||
bloodcrawl = BLOODCRAWL_EAT
|
||||
var/list/consumed_mobs = list()
|
||||
var/playstyle_string = "<span class='big bold'>You are an imp,</span><B> a mischevious creature from hell. You are the lowest rank on the hellish totem pole \
|
||||
var/playstyle_string = "<span class='big bold'>You are an imp,</span><B> a mischievous creature from hell. You are the lowest rank on the hellish totem pole \
|
||||
Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \
|
||||
of intentionally harming a fellow devil.</B>"
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
|
||||
//Left hand items
|
||||
for(var/obj/item/I in held_items)
|
||||
if(!(I.flags_1 & ABSTRACT_1))
|
||||
if(!(I.item_flags & ABSTRACT))
|
||||
msg += "It is holding [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))].\n"
|
||||
|
||||
//Braindead
|
||||
|
||||
@@ -54,7 +54,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
stage_speed += initial(S.stage_speed)
|
||||
transmittable += initial(S.transmittable)
|
||||
threshold_block += "<br><br>[initial(S.threshold_desc)]"
|
||||
stat_block = "Resistance: [resistance]<br>Stealth: [stealth]<br>Stage Speed: [stage_speed]<br>Transmittability: [transmittable]<br><br>"
|
||||
stat_block = "Resistance: [resistance]<br>Stealth: [stealth]<br>Stage Speed: [stage_speed]<br>Transmissibility: [transmittable]<br><br>"
|
||||
|
||||
/datum/disease_ability/proc/CanBuy(mob/camera/disease/D)
|
||||
if(world.time < D.next_adaptation_time)
|
||||
@@ -130,14 +130,14 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
required_total_points = 0
|
||||
start_with = TRUE
|
||||
short_desc = "Force the host you are following to cough, spreading your infection to those nearby."
|
||||
long_desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmitability is low.<br>Cooldown: 10 seconds"
|
||||
long_desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmissibility is low.<br>Cooldown: 10 seconds"
|
||||
|
||||
|
||||
/datum/action/cooldown/disease_cough
|
||||
name = "Cough"
|
||||
icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
|
||||
button_icon_state = "cough"
|
||||
desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmitability is low.<br>Cooldown: 10 seconds"
|
||||
desc = "Force the host you are following to cough with extra force, spreading your infection to those within two meters of your host even if your transmissibility is low.<br>Cooldown: 10 seconds"
|
||||
cooldown_time = 100
|
||||
|
||||
/datum/action/cooldown/disease_cough/Trigger()
|
||||
@@ -148,7 +148,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
if(!L)
|
||||
return FALSE
|
||||
if(L.stat != CONSCIOUS)
|
||||
to_chat(D, "<span class='warning'>Your host must be concious to cough.</span>")
|
||||
to_chat(D, "<span class='warning'>Your host must be conscious to cough.</span>")
|
||||
return FALSE
|
||||
to_chat(D, "<span class='notice'>You force [L.real_name] to cough.</span>")
|
||||
L.emote("cough")
|
||||
@@ -170,7 +170,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
name = "Sneeze"
|
||||
icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
|
||||
button_icon_state = "sneeze"
|
||||
desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host even if your transmitability is low.<br>Cooldown: 20 seconds"
|
||||
desc = "Force the host you are following to sneeze with extra force, spreading your infection to any victims in a 4 meter cone in front of your host even if your transmissibility is low.<br>Cooldown: 20 seconds"
|
||||
cooldown_time = 200
|
||||
|
||||
/datum/action/cooldown/disease_sneeze/Trigger()
|
||||
@@ -181,7 +181,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
if(!L)
|
||||
return FALSE
|
||||
if(L.stat != CONSCIOUS)
|
||||
to_chat(D, "<span class='warning'>Your host must be concious to sneeze.</span>")
|
||||
to_chat(D, "<span class='warning'>Your host must be conscious to sneeze.</span>")
|
||||
return FALSE
|
||||
to_chat(D, "<span class='notice'>You force [L.real_name] to sneeze.</span>")
|
||||
L.emote("sneeze")
|
||||
@@ -243,7 +243,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
cost = 2
|
||||
required_total_points = 4
|
||||
short_desc = "Cause victims to cough intermittently."
|
||||
long_desc = "Cause victims to cough intermittently, spreading your infection if your transmitability is high."
|
||||
long_desc = "Cause victims to cough intermittently, spreading your infection if your transmissibility is high."
|
||||
|
||||
/datum/disease_ability/symptom/sneeze
|
||||
name = "Involuntary Sneezing"
|
||||
@@ -251,7 +251,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
cost = 2
|
||||
required_total_points = 4
|
||||
short_desc = "Cause victims to sneeze intermittently."
|
||||
long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmitability and resistance, at the cost of stealth."
|
||||
long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmissibility and resistance, at the cost of stealth."
|
||||
|
||||
/datum/disease_ability/symptom/beard
|
||||
//I don't think I need to justify the fact that this is the best symptom
|
||||
@@ -277,7 +277,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Cause victims to choke."
|
||||
long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmittability."
|
||||
long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmissibility."
|
||||
|
||||
|
||||
/datum/disease_ability/symptom/confusion
|
||||
@@ -295,7 +295,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Cause victims to become eternally young."
|
||||
long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmittability."
|
||||
long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility."
|
||||
|
||||
|
||||
/datum/disease_ability/symptom/vomit
|
||||
@@ -304,7 +304,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Cause victims to vomit."
|
||||
long_desc = "Cause victims to vomit. Slightly increases transmittability. Vomiting also also causes the victims to lose nutrition and removes some toxin damage."
|
||||
long_desc = "Cause victims to vomit. Slightly increases transmissibility. Vomiting also also causes the victims to lose nutrition and removes some toxin damage."
|
||||
|
||||
|
||||
/datum/disease_ability/symptom/voice_change
|
||||
@@ -367,7 +367,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
|
||||
cost = 4
|
||||
required_total_points = 8
|
||||
short_desc = "Cause victims to lose weight."
|
||||
long_desc = "Cause victims to lose weight, and make it almost immpossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing."
|
||||
long_desc = "Cause victims to lose weight, and make it almost impossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing."
|
||||
|
||||
|
||||
/datum/disease_ability/symptom/metabolism_heal
|
||||
|
||||
@@ -81,7 +81,7 @@ the new instance inside the host to be updated to the template's stats.
|
||||
/mob/camera/disease/Login()
|
||||
..()
|
||||
if(freemove)
|
||||
to_chat(src, "<span class='warning'>You have [round((freemove_end - world.time)/10)] seconds to select your first host. Click on a human to select your host.</span>")
|
||||
to_chat(src, "<span class='warning'>You have [DisplayTimeText(freemove_end - world.time)] to select your first host. Click on a human to select your host.</span>")
|
||||
|
||||
|
||||
/mob/camera/disease/Stat()
|
||||
@@ -285,7 +285,7 @@ the new instance inside the host to be updated to the template's stats.
|
||||
..()
|
||||
|
||||
/mob/camera/disease/proc/adapt_cooldown()
|
||||
to_chat(src, "<span class='notice'>You have altered your genetic structure. You will be unable to adapt again for [adaptation_cooldown/10] seconds.</span>")
|
||||
to_chat(src, "<span class='notice'>You have altered your genetic structure. You will be unable to adapt again for [DisplayTimeText(adaptation_cooldown)].</span>")
|
||||
next_adaptation_time = world.time + adaptation_cooldown
|
||||
addtimer(CALLBACK(src, .proc/notify_adapt_ready), adaptation_cooldown)
|
||||
|
||||
@@ -310,7 +310,7 @@ the new instance inside the host to be updated to the template's stats.
|
||||
Resistance: [DT.totalResistance()]<br>\
|
||||
Stealth: [DT.totalStealth()]<br>\
|
||||
Stage Speed: [DT.totalStageSpeed()]<br>\
|
||||
Transmittability: [DT.totalTransmittable()]<hr>\
|
||||
Transmissibility: [DT.totalTransmittable()]<hr>\
|
||||
Cure: [DT.cure_text]"
|
||||
dat += "<hr><h1>Adaptations</h1>\
|
||||
Points: [points] / [total_points]\
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
W.access += get_all_centcom_access()
|
||||
W.assignment = "Highlander"
|
||||
W.registered_name = H.real_name
|
||||
W.flags_1 |= NODROP_1
|
||||
W.item_flags |= NODROP
|
||||
W.update_label(H.real_name)
|
||||
H.equip_to_slot_or_del(W, SLOT_WEAR_ID)
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec)
|
||||
Such a brazen move will attract the attention of powerful benefactors within the Syndicate, who will supply your team with a massive amount of bonus telecrystals. \
|
||||
Must be used within five minutes, or your benefactors will lose interest."
|
||||
var/declaring_war = FALSE
|
||||
var/uplink_type = /obj/item/radio/uplink/nuclear
|
||||
var/uplink_type = /obj/item/uplink/nuclear
|
||||
|
||||
/obj/item/nuclear_challenge/attack_self(mob/living/user)
|
||||
if(!check_allowed(user))
|
||||
@@ -88,7 +88,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec)
|
||||
return TRUE
|
||||
|
||||
/obj/item/nuclear_challenge/clownops
|
||||
uplink_type = /obj/item/radio/uplink/clownop
|
||||
uplink_type = /obj/item/uplink/clownop
|
||||
|
||||
#undef CHALLENGE_TELECRYSTALS
|
||||
#undef CHALLENGE_TIME_LIMIT
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
/obj/item/pinpointer/nuke/proc/switch_mode_to(new_mode)
|
||||
if(isliving(loc))
|
||||
var/mob/living/L = loc
|
||||
to_chat(L, "<span class='userdanger'>Your [name] beeps as it reconfigures its tracking algorithms.</span>")
|
||||
to_chat(L, "<span class='userdanger'>Your [name] beeps as it reconfigures it's tracking algorithms.</span>")
|
||||
playsound(L, 'sound/machines/triple_beep.ogg', 50, 1)
|
||||
mode = new_mode
|
||||
scan_for_target()
|
||||
@@ -65,7 +65,8 @@
|
||||
/obj/item/pinpointer/syndicate_cyborg // Cyborg pinpointers just look for a random operative.
|
||||
name = "cyborg syndicate pinpointer"
|
||||
desc = "An integrated tracking device, jury-rigged to search for living Syndicate operatives."
|
||||
flags_1 = NODROP_1
|
||||
item_flags = NODROP
|
||||
flags_1 = NONE
|
||||
|
||||
/obj/item/pinpointer/syndicate_cyborg/scan_for_target()
|
||||
target = null
|
||||
@@ -79,4 +80,3 @@
|
||||
if(closest_operative)
|
||||
target = closest_operative
|
||||
..()
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
else if (!mission)
|
||||
var/datum/objective/missionobj = new
|
||||
missionobj.owner = owner
|
||||
missionobj.explanation_text = "Conduct a routine preformance review of [station_name()] and its Captain."
|
||||
missionobj.explanation_text = "Conduct a routine performance review of [station_name()] and its Captain."
|
||||
missionobj.completed = 1
|
||||
mission = missionobj
|
||||
objectives |= mission
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
tick_interval = PINPOINTER_PING_TIME
|
||||
alert_type = /obj/screen/alert/status_effect/agent_pinpointer
|
||||
var/minimum_range = PINPOINTER_MINIMUM_RANGE
|
||||
var/range_fuzz_factor = PINPOINTER_EXTRA_RANDOM_RANGE
|
||||
var/mob/scan_target = null
|
||||
|
||||
/obj/screen/alert/status_effect/agent_pinpointer
|
||||
@@ -61,7 +62,7 @@
|
||||
if(here.z != there.z)
|
||||
linked_alert.icon_state = "pinonnull"
|
||||
return
|
||||
if(get_dist_euclidian(here,there)<=minimum_range + rand(0, PINPOINTER_EXTRA_RANDOM_RANGE))
|
||||
if(get_dist_euclidian(here,there)<=minimum_range + rand(0, range_fuzz_factor))
|
||||
linked_alert.icon_state = "pinondirect"
|
||||
else
|
||||
linked_alert.setDir(get_dir(here, there))
|
||||
@@ -228,14 +229,14 @@
|
||||
|
||||
/datum/antagonist/traitor/internal_affairs/forge_traitor_objectives()
|
||||
forge_iaa_objectives()
|
||||
|
||||
|
||||
var/objtype = traitor_kind == TRAITOR_HUMAN ? /datum/objective/escape : /datum/objective/survive
|
||||
var/datum/objective/escape_objective = new objtype
|
||||
escape_objective.owner = owner
|
||||
add_objective(escape_objective)
|
||||
|
||||
/datum/antagonist/traitor/internal_affairs/proc/greet_iaa()
|
||||
var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "recieving bribes", "malpractice", "worship of prohbited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence")
|
||||
var/crime = pick("distribution of contraband" , "unauthorized erotic action on duty", "embezzlement", "piloting under the influence", "dereliction of duty", "syndicate collaboration", "mutiny", "multiple homicides", "corporate espionage", "receiving bribes", "malpractice", "worship of prohibited life forms", "possession of profane texts", "murder", "arson", "insulting their manager", "grand theft", "conspiracy", "attempting to unionize", "vandalism", "gross incompetence")
|
||||
|
||||
to_chat(owner.current, "<span class='userdanger'>You are the [special_role].</span>")
|
||||
if(syndicate)
|
||||
|
||||
@@ -532,7 +532,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
if(!is_station_level(AA.z))
|
||||
continue
|
||||
AA.obj_flags |= EMAGGED
|
||||
to_chat(owner, "<span class='notice'>All air alarm safeties on the station have been overriden. Air alarms may now use the Flood environmental mode.</span>")
|
||||
to_chat(owner, "<span class='notice'>All air alarm safeties on the station have been overridden. Air alarms may now use the Flood environmental mode.</span>")
|
||||
owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0)
|
||||
|
||||
|
||||
@@ -625,7 +625,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
to_chat(ranged_ability_user, "<span class='warning'>You can only animate machines!</span>")
|
||||
return
|
||||
if(!target.can_be_overridden() || is_type_in_typecache(target, GLOB.blacklisted_malf_machines))
|
||||
to_chat(ranged_ability_user, "<span class='warning'>That machine can't be overriden!</span>")
|
||||
to_chat(ranged_ability_user, "<span class='warning'>That machine can't be overridden!</span>")
|
||||
return
|
||||
ranged_ability_user.playsound_local(ranged_ability_user, 'sound/misc/interference.ogg', 50, 0)
|
||||
attached_action.adjust_uses(-1)
|
||||
@@ -806,7 +806,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
desc = "[initial(desc)] There are [uses] reactivations remaining."
|
||||
|
||||
|
||||
//Upgrade Camera Network: EMP-proofs all cameras, in addition to giving them x-ray vision.
|
||||
//Upgrade Camera Network: EMP-proofs all cameras, in addition to giving them X-ray vision.
|
||||
/datum/AI_Module/large/upgrade_cameras
|
||||
module_name = "Upgrade Camera Network"
|
||||
mod_pick_name = "upgradecam"
|
||||
|
||||
@@ -16,8 +16,17 @@
|
||||
|
||||
/datum/antagonist/valentine/on_gain()
|
||||
forge_objectives()
|
||||
if(isliving(owner))
|
||||
var/mob/living/L = owner
|
||||
L.apply_status_effect(STATUS_EFFECT_INLOVE, date)
|
||||
. = ..()
|
||||
|
||||
/datum/antagonist/valentine/on_removal()
|
||||
. = ..()
|
||||
if(isliving(owner))
|
||||
var/mob/living/L = owner
|
||||
L.remove_status_effect(STATUS_EFFECT_INLOVE)
|
||||
|
||||
/datum/antagonist/valentine/greet()
|
||||
to_chat(owner, "<span class='warning'><B>You're on a date with [date.name]! Protect [date.p_them()] at all costs. This takes priority over all other loyalties.</B></span>")
|
||||
|
||||
|
||||
@@ -109,6 +109,10 @@
|
||||
move()
|
||||
eat()
|
||||
return
|
||||
|
||||
/obj/singularity/wizard/mapped/admin_investigate_setup()
|
||||
return
|
||||
|
||||
/////////////////////////////////////////Scrying///////////////////
|
||||
|
||||
/obj/item/scrying
|
||||
@@ -205,7 +209,7 @@
|
||||
for(var/obj/item/I in H)
|
||||
H.dropItemToGround(I)
|
||||
|
||||
var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionaire)
|
||||
var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionnaire)
|
||||
H.equip_to_slot_or_del(new hat(H), SLOT_HEAD)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/roman(H), SLOT_W_UNIFORM)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), SLOT_SHOES)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefact's power."
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
var/usability = 0
|
||||
var/usability = FALSE
|
||||
|
||||
var/old_shard = FALSE
|
||||
var/spent = FALSE
|
||||
@@ -23,7 +23,7 @@
|
||||
whatever spark it once held long extinguished."
|
||||
|
||||
/obj/item/soulstone/anybody
|
||||
usability = 1
|
||||
usability = TRUE
|
||||
|
||||
/obj/item/soulstone/anybody/chaplain
|
||||
name = "mysterious old shard"
|
||||
@@ -63,8 +63,9 @@
|
||||
if(!ishuman(M))//If target is not a human.
|
||||
return ..()
|
||||
if(iscultist(M))
|
||||
to_chat(user, "<span class='cultlarge'>\"Come now, do not capture your bretheren's soul.\"</span>")
|
||||
return
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='cultlarge'>\"Come now, do not capture your bretheren's soul.\"</span>")
|
||||
return
|
||||
add_logs(user, M, "captured [M.name]'s soul", src)
|
||||
transfer_soul("VICTIM", M, user)
|
||||
|
||||
@@ -82,7 +83,7 @@
|
||||
/obj/item/soulstone/proc/release_shades(mob/user)
|
||||
for(var/mob/living/simple_animal/shade/A in src)
|
||||
A.status_flags &= ~GODMODE
|
||||
A.canmove = 1
|
||||
A.canmove = TRUE
|
||||
A.forceMove(get_turf(user))
|
||||
A.cancel_camera()
|
||||
icon_state = "soulstone"
|
||||
@@ -128,15 +129,15 @@
|
||||
switch(choice)
|
||||
if("FORCE")
|
||||
if(!iscarbon(target)) //TODO: Add sacrifice stoning for non-organics, just because you have no body doesnt mean you dont have a soul
|
||||
return 0
|
||||
return FALSE
|
||||
if(contents.len)
|
||||
return 0
|
||||
return FALSE
|
||||
var/mob/living/carbon/T = target
|
||||
if(T.client != null)
|
||||
for(var/obj/item/W in T)
|
||||
T.dropItemToGround(W)
|
||||
init_shade(T, user)
|
||||
return 1
|
||||
return TRUE
|
||||
else
|
||||
to_chat(user, "<span class='userdanger'>Capture failed!</span>: The soul has already fled its mortal frame. You attempt to bring it back...")
|
||||
return getCultGhost(T,user)
|
||||
@@ -149,7 +150,7 @@
|
||||
to_chat(user, "<span class='cult'><b>\"This soul is mine.</b></span> <span class='cultlarge'>SACRIFICE THEM!\"</span>")
|
||||
else
|
||||
to_chat(user, "<span class='danger'>The soulstone seems to reject this soul.</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
if(contents.len)
|
||||
to_chat(user, "<span class='userdanger'>Capture failed!</span>: The soulstone is full! Free an existing soul to make room.")
|
||||
else
|
||||
@@ -172,7 +173,7 @@
|
||||
else
|
||||
T.forceMove(src) //put shade in stone
|
||||
T.status_flags |= GODMODE
|
||||
T.canmove = 0
|
||||
T.canmove = FALSE
|
||||
T.health = T.maxHealth
|
||||
icon_state = "soulstone2"
|
||||
name = "soulstone: Shade of [T.real_name]"
|
||||
@@ -239,7 +240,7 @@
|
||||
T.dust_animation()
|
||||
var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade(src)
|
||||
S.status_flags |= GODMODE //So they won't die inside the stone somehow
|
||||
S.canmove = 0//Can't move out of the soul stone
|
||||
S.canmove = FALSE//Can't move out of the soul stone
|
||||
S.name = "Shade of [T.real_name]"
|
||||
S.real_name = "Shade of [T.real_name]"
|
||||
S.key = T.key
|
||||
@@ -272,15 +273,15 @@
|
||||
if(consenting_candidates.len)
|
||||
chosen_ghost = pick(consenting_candidates)
|
||||
if(!T)
|
||||
return 0
|
||||
return FALSE
|
||||
if(!chosen_ghost)
|
||||
to_chat(U, "<span class='danger'>There were no spirits willing to become a shade.</span>")
|
||||
return 0
|
||||
return FALSE
|
||||
if(contents.len) //If they used the soulstone on someone else in the meantime
|
||||
return 0
|
||||
return FALSE
|
||||
T.ckey = chosen_ghost.ckey
|
||||
for(var/obj/item/W in T)
|
||||
T.dropItemToGround(W)
|
||||
init_shade(T, U)
|
||||
qdel(T)
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
@@ -318,7 +318,7 @@
|
||||
|
||||
/datum/spellbook_entry/item/scryingorb
|
||||
name = "Scrying Orb"
|
||||
desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision."
|
||||
desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you X-ray vision."
|
||||
item_path = /obj/item/scrying
|
||||
category = "Defensive"
|
||||
|
||||
@@ -409,7 +409,7 @@
|
||||
|
||||
/datum/spellbook_entry/item/battlemage
|
||||
name = "Battlemage Armour"
|
||||
desc = "An ensorcelled suit of armour, protected by a powerful shield. The shield can completly negate sixteen attacks before being permanently depleted."
|
||||
desc = "An ensorceled suit of armour, protected by a powerful shield. The shield can completely negate sixteen attacks before being permanently depleted."
|
||||
item_path = /obj/item/clothing/suit/space/hardsuit/shielded/wizard
|
||||
limit = 1
|
||||
category = "Defensive"
|
||||
@@ -452,7 +452,7 @@
|
||||
|
||||
/datum/spellbook_entry/summon/ghosts
|
||||
name = "Summon Ghosts"
|
||||
desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilties to frustrate you."
|
||||
desc = "Spook the crew out by making them see dead people. Be warned, ghosts are capricious and occasionally vindicative, and some will use their incredibly minor abilities to frustrate you."
|
||||
cost = 0
|
||||
|
||||
/datum/spellbook_entry/summon/ghosts/IsAvailible()
|
||||
@@ -589,22 +589,22 @@
|
||||
switch(category)
|
||||
if("Offensive")
|
||||
dat += "Spells and items geared towards debilitating and destroying.<BR><BR>"
|
||||
dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.<BR>"
|
||||
dat += "Items are not bound to you and can be stolen. Additionally they cannot typically be returned once purchased.<BR>"
|
||||
dat += "For spells: the number after the spell name is the cooldown time.<BR>"
|
||||
dat += "You can reduce this number by spending more points on the spell.<BR>"
|
||||
if("Defensive")
|
||||
dat += "Spells and items geared towards improving your survivabilty or reducing foes' ability to attack.<BR><BR>"
|
||||
dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.<BR>"
|
||||
dat += "Spells and items geared towards improving your survivability or reducing foes' ability to attack.<BR><BR>"
|
||||
dat += "Items are not bound to you and can be stolen. Additionally they cannot typically be returned once purchased.<BR>"
|
||||
dat += "For spells: the number after the spell name is the cooldown time.<BR>"
|
||||
dat += "You can reduce this number by spending more points on the spell.<BR>"
|
||||
if("Mobility")
|
||||
dat += "Spells and items geared towards improving your ability to move. It is a good idea to take at least one.<BR><BR>"
|
||||
dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.<BR>"
|
||||
dat += "Items are not bound to you and can be stolen. Additionally they cannot typically be returned once purchased.<BR>"
|
||||
dat += "For spells: the number after the spell name is the cooldown time.<BR>"
|
||||
dat += "You can reduce this number by spending more points on the spell.<BR>"
|
||||
if("Assistance")
|
||||
dat += "Spells and items geared towards bringing in outside forces to aid you or improving upon your other items and abilties.<BR><BR>"
|
||||
dat += "Items are not bound to you and can be stolen. Additionaly they cannot typically be returned once purchased.<BR>"
|
||||
dat += "Spells and items geared towards bringing in outside forces to aid you or improving upon your other items and abilities.<BR><BR>"
|
||||
dat += "Items are not bound to you and can be stolen. Additionally they cannot typically be returned once purchased.<BR>"
|
||||
dat += "For spells: the number after the spell name is the cooldown time.<BR>"
|
||||
dat += "You can reduce this number by spending more points on the spell.<BR>"
|
||||
if("Challenges")
|
||||
|
||||
Reference in New Issue
Block a user