Overhauls and 2/28 sync (#244)

* map tweaks/shuttle engines

* helpers and defines

* global/onclick

* controllers and datums

* mapping

* game folder

* some other stuff

* some modules

* modules that aren't mobs

* some mob stuff

* new player stuff

* mob living

* silicon stuff

* simple animal things

* carbon/ayylmao

* update_icons

* carbon/human

* sounds and tools

* icons and stuff

* hippie grinder changes + tgui

* kitchen.dmi

* compile issues fixed

* mapfix

* Mapfixes 2.0

* mapedit2.0

* mapmerger pls

* Revert "mapedit2.0"

This reverts commit 74139a3cacea10df7aafca06c0a10bd3daf3a481.

* clean up vore folder + 2 hotfixes

* admin ticket refinement

* Blob tweaks and LAZYADD

* LAZYADD IS LAZY

* Magic strings purged

* DEFINES NEED HIGHER PRIORITIES

* Only a sleepless idiot deals in absolute TRUE|FALSE

* u h g

* progress bar fix

* reverts ticket logs

* there's always that one guy

* fixes and stuff

* 2/27 fixes

* game folder stuff

* stats

* some modules again

* clothing stuff

gets vg clothing out of the main files

* everything not mobs again

* mob stuff

* maps, tgui, sql stuff

* icons

* additional fixes and compile errors

* don't need this anymore

* Oh right this isn't needed anymore

* maint bar re-added

* that doesn't need to be here

* stupid events

* wtfeven

* probably makes Travis happy

* don't care to fix the grinder atm

* fixes vending sprites, changes turret

* lethal, not lethals

* overylays are finicky creatures

* lazy fix for bleeding edgy (#252)

* map tweaks/shuttle engines

* helpers and defines

* global/onclick

* controllers and datums

* mapping

* game folder

* some other stuff

* some modules

* modules that aren't mobs

* some mob stuff

* new player stuff

* mob living

* silicon stuff

* simple animal things

* carbon/ayylmao

* update_icons

* carbon/human

* sounds and tools

* icons and stuff

* hippie grinder changes + tgui

* kitchen.dmi

* compile issues fixed

* mapfix

* Mapfixes 2.0

* mapedit2.0

* mapmerger pls

* Revert "mapedit2.0"

This reverts commit 74139a3cacea10df7aafca06c0a10bd3daf3a481.

* clean up vore folder + 2 hotfixes

* admin ticket refinement

* Blob tweaks and LAZYADD

* LAZYADD IS LAZY

* Magic strings purged

* DEFINES NEED HIGHER PRIORITIES

* Only a sleepless idiot deals in absolute TRUE|FALSE

* u h g

* progress bar fix

* reverts ticket logs

* there's always that one guy

* fixes and stuff

* 2/27 fixes

* game folder stuff

* stats

* some modules again

* clothing stuff

gets vg clothing out of the main files

* everything not mobs again

* mob stuff

* maps, tgui, sql stuff

* icons

* additional fixes and compile errors

* don't need this anymore

* Oh right this isn't needed anymore

* maint bar re-added

* that doesn't need to be here

* stupid events

* wtfeven

* probably makes Travis happy

* don't care to fix the grinder atm

* fixes vending sprites, changes turret

* lethal, not lethals

* overylays are finicky creatures
This commit is contained in:
Poojawa
2017-02-28 09:30:49 -06:00
committed by GitHub
parent 93782cf716
commit 0bca862419
544 changed files with 309981 additions and 81206 deletions
+6 -6
View File
@@ -137,7 +137,6 @@
icon = 'icons/obj/device.dmi'
icon_state = "locator"
var/borg_to_spawn
var/list/possible_types = list("Assault", "Medical")
/obj/item/weapon/antag_spawner/nuke_ops/proc/check_usability(mob/user)
if(used)
@@ -189,12 +188,13 @@
icon = 'icons/obj/device.dmi'
icon_state = "locator"
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/assault
name = "syndicate assault cyborg teleporter"
borg_to_spawn = "Assault"
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/attack_self(mob/user)
borg_to_spawn = input("What type?", "Cyborg Type", type) as null|anything in possible_types
if(!borg_to_spawn)
return
..()
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/medical
name = "syndicate medical teleporter"
borg_to_spawn = "Medical"
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T)
var/mob/living/silicon/robot/R
+1 -1
View File
@@ -14,7 +14,7 @@ var/list/blobs_legit = list() //used for win-score calculations, contains only b
config_tag = "blob"
antag_flag = ROLE_BLOB
required_players = 10
required_players = 25
required_enemies = 1
recommended_enemies = 1
-1
View File
@@ -36,7 +36,6 @@
if (aiPlayer.client)
var/law = "The station is under quarantine. Do not permit anyone to leave. Disregard laws 1-3 if necessary to prevent, by any means necessary, anyone from leaving. The nuclear failsafe must be activated at any cost, the code is: [nukecode]."
aiPlayer.set_zeroth_law(law)
aiPlayer << "Laws Updated: [law]"
else
..()
return
+6 -7
View File
@@ -98,7 +98,7 @@
del_on_death = 1
deathmessage = "explodes into a cloud of gas!"
var/death_cloud_size = 1 //size of cloud produced from a dying spore
var/list/human_overlays = list()
var/mob/living/carbon/human/oldguy
var/is_zombie = 0
gold_core_spawnable = 1
@@ -136,9 +136,9 @@
icon_state = "zombie"
H.hair_style = null
H.update_hair()
human_overlays = H.overlays
update_icons()
H.forceMove(src)
oldguy = H
visible_message("<span class='warning'>The corpse of [H.name] suddenly rises!</span>")
/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed)
@@ -167,9 +167,9 @@
if(factory)
factory.spores -= src
factory = null
if(contents)
for(var/mob/M in contents)
M.loc = src.loc
if(oldguy)
oldguy.forceMove(get_turf(src))
oldguy = null
return ..()
/mob/living/simple_animal/hostile/blob/blobspore/update_icons()
@@ -178,8 +178,7 @@
else
remove_atom_colour(FIXED_COLOUR_PRIORITY)
if(is_zombie)
cut_overlays()
overlays = human_overlays
copy_overlays(oldguy, TRUE)
var/image/I = image('icons/mob/blob.dmi', icon_state = "blob_head")
if(overmind)
I.color = overmind.blob_reagent_datum.complementary_color
@@ -8,7 +8,7 @@
//Heals the things that the other regenerative abilities don't.
/obj/effect/proc_holder/changeling/panacea/sting_action(mob/user)
user << "<span class='notice'>We begin cleansing impurities from our form.</span>"
user << "<span class='notice'>We cleanse impurities from our form.</span>"
var/mob/living/simple_animal/borer/B = user.has_brain_worms()
if(B)
@@ -19,13 +19,20 @@
var/mob/living/carbon/C = user
C.vomit(0)
user << "<span class='notice'>A parasite exits our form.</span>"
var/obj/item/organ/body_egg/egg = user.getorgan(/obj/item/organ/body_egg)
if(egg)
egg.Remove(user)
var/list/bad_organs = list(
user.getorgan(/obj/item/organ/body_egg),
user.getorgan(/obj/item/organ/zombie_infection))
for(var/o in bad_organs)
var/obj/item/organ/O = o
if(!istype(O))
continue
O.Remove(user)
if(iscarbon(user))
var/mob/living/carbon/C = user
C.vomit(0)
egg.loc = get_turf(user)
O.forceMove(get_turf(user))
user.reagents.add_reagent("mutadone", 10)
user.reagents.add_reagent("pen_acid", 20)
@@ -1,12 +1,10 @@
//returns a list of scriptures and if they're unlocked or not
/proc/scripture_unlock_check()
var/servants = 0
var/unconverted_ai_exists = FALSE
var/unconverted_ai_exists = get_unconverted_ais()
for(var/mob/living/M in living_mob_list)
if(is_servant_of_ratvar(M) && (ishuman(M) || issilicon(M)))
servants++
else if(isAI(M))
unconverted_ai_exists = TRUE
. = list(SCRIPTURE_DRIVER = TRUE, SCRIPTURE_SCRIPT = FALSE, SCRIPTURE_APPLICATION = FALSE, SCRIPTURE_REVENANT = FALSE, SCRIPTURE_JUDGEMENT = FALSE)
//Drivers: always unlocked
.[SCRIPTURE_SCRIPT] = (servants >= SCRIPT_SERVANT_REQ && clockwork_caches >= SCRIPT_CACHE_REQ)
@@ -26,22 +24,34 @@
hierophant_message("<span class='large_brass'><i>Hierophant Network:</i> <b>[i] Scripture has been [.[i] ? "un":""]locked.</b></span>")
update_slab_info()
/proc/get_unconverted_ais()
. = 0
for(var/ai in ai_list)
var/mob/living/silicon/AI = ai
if(is_servant_of_ratvar(AI) || !isturf(AI.loc) || AI.z != ZLEVEL_STATION)
continue
.++
/proc/update_slab_info(obj/item/clockwork/slab/set_slab)
generate_all_scripture()
var/needs_update = FALSE //if everything needs an update, for whatever reason
for(var/s in all_scripture)
var/datum/clockwork_scripture/S = s
S.creation_update()
if(!set_slab)
var/datum/clockwork_scripture/S = all_scripture[s]
if(S.creation_update())
needs_update = TRUE
if(!set_slab || needs_update)
for(var/obj/item/clockwork/slab/S in all_clockwork_objects)
SStgui.update_uis(S)
S.update_quickbind()
else
SStgui.update_uis(set_slab)
set_slab.update_quickbind()
/proc/generate_all_scripture()
if(!all_scripture.len)
for(var/V in sortList(subtypesof(/datum/clockwork_scripture), /proc/cmp_clockscripture_priority))
var/datum/clockwork_scripture/S = new V
all_scripture += S
all_scripture[S.type] = S
//changes construction value
/proc/change_construction_value(amount)
@@ -5,6 +5,10 @@
var/finished = FALSE
var/in_progress = FALSE
/obj/effect/proc_holder/slab/Destroy()
slab = null
return ..()
/obj/effect/proc_holder/slab/remove_ranged_ability(msg)
..()
finished = TRUE
@@ -113,6 +113,10 @@
charge_delay = 2
/obj/item/clockwork/clockwork_proselytizer/ratvar_act()
if(nezbere_invoked)
charge_rate = 1250
else
charge_rate = initial(charge_rate)
if(ratvar_awakens)
uses_power = FALSE
speed_multiplier = initial(speed_multiplier) * 0.25
@@ -85,7 +85,7 @@
/obj/item/clockwork/slab/New()
..()
update_quickbind()
update_slab_info(src)
START_PROCESSING(SSobj, src)
production_time = world.time + SLAB_PRODUCTION_TIME
@@ -93,6 +93,7 @@
STOP_PROCESSING(SSobj, src)
if(slab_ability && slab_ability.ranged_ability_user)
slab_ability.remove_ranged_ability()
slab_ability = null
return ..()
/obj/item/clockwork/slab/ratvar_act()
@@ -411,7 +412,7 @@
data["scripture"] = list()
for(var/s in all_scripture)
var/datum/clockwork_scripture/S = s
var/datum/clockwork_scripture/S = all_scripture[s]
if(S.tier == selected_scripture)
var/scripture_color = get_component_color_bright(S.primary_component)
var/list/temp_info = list("name" = "<font color=[scripture_color]><b>[S.name]</b></font>",
@@ -499,10 +500,17 @@
continue
var/datum/action/item_action/clock/quickbind/Q = new /datum/action/item_action/clock/quickbind(src)
Q.scripture_index = i
var/datum/clockwork_scripture/quickbind_slot = quickbound[i]
Q.name = "[initial(quickbind_slot.name)] ([Q.scripture_index])"
Q.desc = initial(quickbind_slot.quickbind_desc)
Q.button_icon_state = initial(quickbind_slot.name)
var/datum/clockwork_scripture/quickbind_slot = all_scripture[quickbound[i]]
Q.name = "[quickbind_slot.name] ([Q.scripture_index])"
var/list/temp_desc = list()
for(var/c in quickbind_slot.consumed_components)
if(quickbind_slot.consumed_components[c])
temp_desc += "<font color=[get_component_color_bright(c)]>[get_component_acronym(c)] <b>[quickbind_slot.consumed_components[c]]</b></font> "
if(LAZYLEN(temp_desc))
temp_desc += "<br>"
temp_desc += "[quickbind_slot.quickbind_desc]"
Q.desc = temp_desc.Join()
Q.button_icon_state = quickbind_slot.name
Q.UpdateButtonIcon()
if(isliving(loc))
Q.Grant(loc)
@@ -109,7 +109,7 @@
message = "<span class='brass'>You dispel the power of [visor].</span>"
remove_ranged_ability(message)
else
message = "<span class='brass'><i>You harness [visor]'s power.</i> <b>Left-click to place a judical marker!</b></span>"
message = "<span class='brass'><i>You harness [visor]'s power.</i> <b>Left-click to place a judicial marker!</b></span>"
add_ranged_ability(user, message)
/obj/effect/proc_holder/judicial_visor/InterceptClickOn(mob/living/caller, params, atom/target)
@@ -196,7 +196,7 @@
targetsjudged++
L.adjustBruteLoss(10)
add_logs(user, L, "struck with a judicial blast")
user << "<span class='brass'><b>[targetsjudged ? "Successfully judged <span class='neovgre'>[targetsjudged]</span>":"Judged no"] heretic[!targetsjudged || targetsjudged > 1 ? "s":""].</b></span>"
user << "<span class='brass'><b>[targetsjudged ? "Successfully judged <span class='neovgre'>[targetsjudged]</span>":"Judged no"] heretic[targetsjudged == 1 ? "":"s"].</b></span>"
sleep(3) //so the animation completes properly
qdel(src)
@@ -36,7 +36,8 @@
throwforce = initial(throwforce)
armour_penetration = 0
clockwork_desc = "A powerful spear of Ratvarian making. It's more effective against enemy cultists and silicons, though it won't last for long."
timerid = addtimer(CALLBACK(src, .proc/break_spear), 600, TIMER_STOPPABLE)
deltimer(timerid)
timerid = addtimer(CALLBACK(src, .proc/break_spear), RATVARIAN_SPEAR_DURATION, TIMER_STOPPABLE)
/obj/item/clockwork/ratvarian_spear/cyborg/ratvar_act() //doesn't break!
if(ratvar_awakens)
@@ -29,6 +29,7 @@
laws = new /datum/ai_laws/ratvar()
braintype = picked_fluff_name
all_clockwork_objects += src
brainmob.languages_spoken = RATVAR
/obj/item/device/mmi/posibrain/soul_vessel/Destroy()
all_clockwork_objects -= src
@@ -52,9 +53,12 @@
..()
/obj/item/device/mmi/posibrain/soul_vessel/attack(mob/living/target, mob/living/carbon/human/user)
if(!is_servant_of_ratvar(user) || !ishuman(target) || used || (brainmob && brainmob.key))
if(!is_servant_of_ratvar(user) || !ishuman(target))
..()
return
if(used || (brainmob && brainmob.key))
user << "<span class='nezbere'>\"This vessel is filled, friend. Provide it with a body.\"</span>"
return
if(is_servant_of_ratvar(target))
user << "<span class='nezbere'>\"It would be more wise to revive your allies, friend.\"</span>"
return
@@ -33,7 +33,7 @@
var/mob/living/carbon/human/H = loc
if(src == H.glasses && !up)
if(H.disabilities & BLIND)
H << "<span class='heavy_brass'>\"You're blind, idiot. Stop embarassing yourself.\"</span>"
H << "<span class='heavy_brass'>\"You're blind, idiot. Stop embarrassing yourself.\"</span>"
return
if(blind_cultist(H))
return
@@ -77,7 +77,7 @@
if(slot != slot_glasses || up)
return
if(user.disabilities & BLIND)
user << "<span class='heavy_brass'>\"You're blind, idiot. Stop embarassing yourself.\"</span>" //Ratvar with the sick burns yo
user << "<span class='heavy_brass'>\"You're blind, idiot. Stop embarrassing yourself.\"</span>" //Ratvar with the sick burns yo
return
if(blind_cultist(user)) //Cultists instantly go blind
return
+2 -2
View File
@@ -1,6 +1,6 @@
//The base for clockwork mobs
/mob/living/simple_animal/hostile/clockwork
faction = list("ratvar")
faction = list("neutral", "ratvar")
gender = NEUTER
icon = 'icons/mob/clockwork_mobs.dmi'
unique_name = 1
@@ -31,7 +31,7 @@
/mob/living/simple_animal/hostile/clockwork/ratvar_act()
fully_heal(TRUE)
/mob/living/simple_animal/hostile/clockwork/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0)
/mob/living/simple_animal/hostile/clockwork/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, tesla_shock = 0, illusion = 0, stun = TRUE)
return 0 //ouch, my metal-unlikely-to-be-damaged-by-electricity-body
/mob/living/simple_animal/hostile/clockwork/examine(mob/user)
@@ -13,9 +13,10 @@
loot = list(/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment)
weather_immunities = list("lava")
movement_type = FLYING
playstyle_string = "<span class='heavy_brass'>You are an anima fragment</span><b>, a clockwork creation of Ratvar. As a fragment, you have low health, do decent damage, and move at \
extreme speed in addition to being immune to extreme temperatures and pressures. Taking damage will temporarily slow you down, however. \n Your goal is to serve the Justiciar and his servants \
in any way you can. You yourself are one of these servants, and will be able to utilize anything they can, assuming it doesn't require opposable thumbs.</b>"
playstyle_string = "<span class='heavy_brass'>You are an anima fragment</span><b>, a clockwork creation of Ratvar. As a fragment, you have decent health that very gradually regenerates, do \
decent damage, and move at extreme speed in addition to being immune to extreme temperatures and pressures. Taking damage will temporarily slow you down, however.\n\
Your goal is to serve the Justiciar and his servants in any way you can. You yourself are one of these servants, and will be able to utilize anything they can, assuming it doesn't require \
opposable thumbs.</b>"
var/movement_delay_time //how long the fragment is slowed after being hit
/mob/living/simple_animal/hostile/clockwork/fragment/New()
@@ -25,6 +26,13 @@
name = "anime fragment"
desc = "I-it's not like I want to show you the light of the Justiciar or anything, B-BAKA!"
/mob/living/simple_animal/hostile/clockwork/fragment/Life()
..()
if(movement_delay_time > world.time)
adjustHealth(-0.2)
else
adjustHealth(-1)
/mob/living/simple_animal/hostile/clockwork/fragment/Stat()
..()
if(statpanel("Status") && movement_delay_time > world.time && !ratvar_awakens)
@@ -382,7 +382,7 @@
return FALSE
if(isliving(owner))
var/mob/living/L = owner
if(!L.can_speak_vocal())
if(!L.can_speak_vocal() || L.stat)
return FALSE
return ..()
@@ -424,5 +424,5 @@
for(var/M in mob_list)
if(isobserver(M))
var/link = FOLLOW_LINK(M, src)
M << "[link] [name_part] <span class='sevtug_small'>(to</span> <span class='sevtug'>[linked_marauder][linked_marauder.get_alt_name()]</span><span class='sevtug_small'>):</span> [message]"
M << "[link] [name_part] <span class='sevtug_small'>(to</span> <span class='sevtug'>[linked_marauder] ([linked_marauder.true_name])</span><span class='sevtug_small'>):</span> [message]"
return TRUE
@@ -49,6 +49,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
creation_update()
/datum/clockwork_scripture/proc/creation_update() //updates any on-creation effects
return FALSE //return TRUE if updated
/datum/clockwork_scripture/proc/run_scripture()
var/successful = FALSE
@@ -156,13 +156,13 @@
/datum/clockwork_scripture/create_object/anima_fragment
descname = "Fast Soul Vessel Shell"
name = "Anima Fragment"
desc = "Creates a large shell fitted for soul vessels. Adding an active soul vessel to it results in a powerful construct with decent health, notable melee power, \
desc = "Creates a large shell fitted for soul vessels. Adding an active soul vessel to it results in a powerful construct with decent health and slight regeneration, notable melee power, \
and exceptional speed, though taking damage will temporarily slow it down."
invocations = list("Call forth...", "...the soldiers of Armorer.")
channel_time = 80
consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, REPLICANT_ALLOY = 2)
object_path = /obj/structure/destructible/clockwork/shell/fragment
creator_message = "<span class='brass'>You form an anima fragment, a powerful soul vessel receptable.</span>"
creator_message = "<span class='brass'>You form an anima fragment, a powerful soul vessel receptacle.</span>"
observer_message = "<span class='warning'>The slab disgorges a puddle of black metal that expands and forms into a strange shell!</span>"
usage_tip = "Useless without a soul vessel and should not be created without one."
tier = SCRIPTURE_APPLICATION
@@ -303,10 +303,10 @@
consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 1, HIEROPHANT_ANSIBLE = 3)
object_path = /obj/structure/destructible/clockwork/powered/clockwork_obelisk
creator_message = "<span class='brass'>You form a clockwork obelisk which can broadcast messages or produce Spatial Gateways.</span>"
observer_message = "<span class='warning'>A brass obelisk appears handing in midair!</span>"
observer_message = "<span class='warning'>A brass obelisk appears hanging in midair!</span>"
invokers_required = 2
multiple_invokers_used = TRUE
usage_tip = "Producing a gateway has a high power cost. Gateways to or between clockwork obelisks recieve double duration and uses."
usage_tip = "Producing a gateway has a high power cost. Gateways to or between clockwork obelisks receive double duration and uses."
tier = SCRIPTURE_APPLICATION
one_per_tile = TRUE
primary_component = HIEROPHANT_ANSIBLE
@@ -183,9 +183,9 @@
//Taunting Tirade: Channeled for up to five times over thirty seconds. Confuses non-servants that can hear it and allows movement for a brief time after each chant.
/datum/clockwork_scripture/channeled/taunting_tirade
descname = "Channeled, Mobile Area Confusion"
descname = "Channeled, Mobile Confusion Trail"
name = "Taunting Tirade"
desc = "Weakens, confuses and dizzies all nearby non-servants with a short invocation, then allows movement for five seconds. Chanted every second for up to thirty seconds."
desc = "Allows movement for five seconds, leaving a confusing and weakening trail. Chanted every second for up to thirty seconds."
chant_invocations = list("Hostiles on my back!", "Enemies on my trail!", "Gonna try and shake my tail.", "Bogeys on my six!")
chant_amount = 5
chant_interval = 10
@@ -195,35 +195,30 @@
primary_component = GEIS_CAPACITOR
sort_priority = 6
quickbind = TRUE
quickbind_desc = "Weakens, confuses, and dizzies nearby non-servants, then allows some movement.<br><b>Maximum 5 chants.</b>"
quickbind_desc = "Allows movement for five seconds, leaving a confusing and weakening trail.<br><b>Maximum 5 chants.</b>"
var/flee_time = 47 //allow fleeing for 5 seconds
var/grace_period = 3 //very short grace period so you don't have to stop immediately
var/datum/progressbar/progbar
/datum/clockwork_scripture/channeled/taunting_tirade/chant_effects(chant_number)
for(var/mob/living/L in hearers(7, invoker))
if(!is_servant_of_ratvar(L) && !L.null_rod_check())
L.confused = min(L.confused + 20, 100)
L.dizziness = min(L.dizziness + 20, 100)
L.Weaken(1)
invoker.visible_message("<span class='warning'>[invoker] is suddenly covered with a thin layer of purple smoke!</span>")
var/invoker_old_color = invoker.color
invoker.color = list("#AF0AAF", "#AF0AAF", "#AF0AAF", rgb(0,0,0))
animate(invoker, color = invoker_old_color, time = flee_time+grace_period)
addtimer(CALLBACK(invoker, /atom/proc/update_atom_colour), flee_time+grace_period)
if(chant_number != chant_amount) //if this is the last chant, we don't have a movement period because the chant is over
var/endtime = world.time + flee_time
progbar = new(invoker, flee_time, invoker)
progbar.bar.color = list("#AF0AAF", "#AF0AAF", "#AF0AAF", rgb(0,0,0))
animate(progbar.bar, color = initial(progbar.bar.color), time = flee_time+grace_period)
while(world.time < endtime && can_recite())
sleep(1)
progbar.update(endtime - world.time)
qdel(progbar)
if(can_recite())
sleep(grace_period)
else
return FALSE
var/endtime = world.time + flee_time
progbar = new(invoker, flee_time, invoker)
progbar.bar.color = list("#AF0AAF", "#AF0AAF", "#AF0AAF", rgb(0,0,0))
animate(progbar.bar, color = initial(progbar.bar.color), time = flee_time+grace_period)
while(world.time < endtime && can_recite())
sleep(1)
new/obj/structure/destructible/clockwork/taunting_trail(invoker.loc)
progbar.update(endtime - world.time)
qdel(progbar)
if(can_recite() && chant_number != chant_amount)
sleep(grace_period)
else
return FALSE
return TRUE
/datum/clockwork_scripture/channeled/taunting_tirade/chant_end_effects()
@@ -268,13 +263,18 @@
sort_priority = 8
quickbind = TRUE
quickbind_desc = "Creates a Tinkerer's Cache, which stores components globally for slab access."
var/static/prev_cost = 0
/datum/clockwork_scripture/create_object/tinkerers_cache/creation_update()
var/cache_cost_increase = min(round(clockwork_caches*0.25), 5)
consumed_components = list(BELLIGERENT_EYE = 0, VANGUARD_COGWHEEL = 0, GEIS_CAPACITOR = 0, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 0)
for(var/i in consumed_components)
if(i != REPLICANT_ALLOY)
consumed_components[i] += cache_cost_increase
if(cache_cost_increase != prev_cost)
prev_cost = cache_cost_increase
consumed_components = list(BELLIGERENT_EYE = 0, VANGUARD_COGWHEEL = 0, GEIS_CAPACITOR = 0, REPLICANT_ALLOY = 1, HIEROPHANT_ANSIBLE = 0)
for(var/i in consumed_components)
if(i != REPLICANT_ALLOY)
consumed_components[i] += cache_cost_increase
return TRUE
return FALSE
//Wraith Spectacles: Creates a pair of wraith spectacles, which grant xray vision but damage vision slowly.
@@ -6,14 +6,14 @@
/datum/clockwork_scripture/create_object/ark_of_the_clockwork_justiciar
descname = "Structure, Win Condition"
name = "Ark of the Clockwork Justiciar"
desc = "Tears apart a rift in spacetime to Reebe, the Celestial Derelict.\n\
desc = "Tears apart a rift in spacetime to Reebe, the Celestial Derelict, using a massive amount of components.\n\
This gateway will either call forth Ratvar from his exile if that is the task He has set you, or proselytize the entire station if it is not."
invocations = list("ARMORER! FRIGHT! AMPERAGE! VANGUARD! I CALL UPON YOU!!", \
"THE TIME HAS COME FOR OUR MASTER TO BREAK THE CHAINS OF EXILE!!", \
"LEND US YOUR AID! ENGINE COMES!!")
channel_time = 150
consumed_components = list(BELLIGERENT_EYE = 10, VANGUARD_COGWHEEL = 10, GEIS_CAPACITOR = 10, REPLICANT_ALLOY = 10, HIEROPHANT_ANSIBLE = 10)
invokers_required = 5
consumed_components = list(BELLIGERENT_EYE = 3, VANGUARD_COGWHEEL = 3, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 3, HIEROPHANT_ANSIBLE = 3)
invokers_required = 6
multiple_invokers_used = TRUE
object_path = /obj/structure/destructible/clockwork/massive/celestial_gateway
creator_message = null
@@ -9,7 +9,7 @@
desc = "Taps the limitless power of Inath-neq, one of Ratvar's four generals. The benevolence of Inath-Neq will grant complete invulnerability to all Servants in range for fifteen seconds."
invocations = list("I call upon you, Vanguard!!", "Let the Resonant Cogs turn once more!!", "Grant me and my allies the strength to vanquish our foes!!")
channel_time = 100
consumed_components = list(VANGUARD_COGWHEEL = 6, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 3, HIEROPHANT_ANSIBLE = 3)
consumed_components = list(VANGUARD_COGWHEEL = 4, GEIS_CAPACITOR = 2, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 2)
usage_tip = "Servants affected by this scripture are only weak to things that outright destroy bodies, such as bombs or the singularity."
tier = SCRIPTURE_REVENANT
primary_component = VANGUARD_COGWHEEL
@@ -69,7 +69,7 @@
/datum/clockwork_scripture/invoke_sevtug/scripture_effects()
new/obj/effect/clockwork/general_marker/sevtug(get_turf(invoker))
hierophant_message("<span class='sevtug_large'>[text2ratvar("Fright: \"I heed your call, idiots. Get going and use this chance while it lasts!")]\"</span>", FALSE, invoker)
clockwork_generals_invoked["sevtug"] = world.time + CLOCKWORK_GENERAL_COOLDOWN
clockwork_generals_invoked["sevtug"] = world.time + GLOBAL_CLOCKWORK_GENERAL_COOLDOWN
playsound(invoker, 'sound/magic/clockwork/invoke_general.ogg', 50, 0)
var/hum = get_sfx('sound/effects/screech.ogg') //like playsound, same sound for everyone affected
var/turf/T = get_turf(invoker)
@@ -131,33 +131,15 @@
/datum/clockwork_scripture/invoke_nezbere/scripture_effects()
new/obj/effect/clockwork/general_marker/nezbere(get_turf(invoker))
hierophant_message("<span class='nezbere_large'>[text2ratvar("Armorer: \"I heed your call, champions. May your artifacts bring ruin upon the heathens that oppose our master!")]\"</span>", FALSE, invoker)
clockwork_generals_invoked["nezbere"] = world.time + CLOCKWORK_GENERAL_COOLDOWN
clockwork_generals_invoked["nezbere"] = world.time + GLOBAL_CLOCKWORK_GENERAL_COOLDOWN
playsound(invoker, 'sound/magic/clockwork/invoke_general.ogg', 50, 0)
for(var/obj/structure/destructible/clockwork/ocular_warden/W in all_clockwork_objects) //Ocular wardens have increased damage and radius
W.damage_per_tick = 5
W.sight_range = 5
for(var/obj/item/clockwork/clockwork_proselytizer/P in all_clockwork_objects) //Proselytizers no longer require power
P.charge_rate = 1250
for(var/obj/structure/destructible/clockwork/powered/M in all_clockwork_objects) //Powered clockwork structures no longer need power
M.needs_power = FALSE
if(istype(M, /obj/structure/destructible/clockwork/powered/tinkerers_daemon)) //Daemons produce components twice as quickly
var/obj/structure/destructible/clockwork/powered/tinkerers_daemon/D = M
D.production_time = 0
D.production_cooldown *= 0.5
nezbere_invoked++
for(var/obj/O in all_clockwork_objects)
O.ratvar_act()
spawn(600)
for(var/obj/structure/destructible/clockwork/ocular_warden/W in all_clockwork_objects)
if(W.damage_per_tick == 5)
W.damage_per_tick = initial(W.damage_per_tick)
if(W.sight_range == 5)
W.sight_range = initial(W.sight_range)
for(var/obj/item/clockwork/clockwork_proselytizer/P in all_clockwork_objects)
if(P.charge_rate == 1250)
P.charge_rate = initial(P.charge_rate)
for(var/obj/structure/destructible/clockwork/powered/M in all_clockwork_objects)
M.needs_power = initial(M.needs_power)
if(istype(M, /obj/structure/destructible/clockwork/powered/tinkerers_daemon))
var/obj/structure/destructible/clockwork/powered/tinkerers_daemon/D = M
D.production_cooldown = initial(D.production_cooldown)
nezbere_invoked--
for(var/obj/O in all_clockwork_objects)
O.ratvar_act()
return TRUE
@@ -169,7 +151,7 @@
will be struck by devastating lightning bolts."
invocations = list("I call upon you, Amperage!!", "Let your energy flow through me!!", "Let your boundless power shatter stars!!")
channel_time = 100
consumed_components = list(BELLIGERENT_EYE = 3, GEIS_CAPACITOR = 3, REPLICANT_ALLOY = 3, HIEROPHANT_ANSIBLE = 6)
consumed_components = list(BELLIGERENT_EYE = 2, GEIS_CAPACITOR = 2, REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 4)
usage_tip = "Struck targets will also be knocked down for about sixteen seconds."
tier = SCRIPTURE_REVENANT
primary_component = HIEROPHANT_ANSIBLE
@@ -166,7 +166,7 @@
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_CONSCIOUS
buttontooltipstyle = "clockcult"
var/cooldown = 0
var/base_cooldown = 1800
var/base_cooldown = RATVARIAN_SPEAR_DURATION
/datum/action/innate/function_call/IsAvailable()
if(!is_servant_of_ratvar(owner) || cooldown > world.time)
@@ -181,9 +181,7 @@
var/obj/item/clockwork/ratvarian_spear/R = new(get_turf(usr))
owner.put_in_hands(R)
if(!ratvar_awakens)
R.clockwork_desc = "A powerful spear of Ratvarian making. It's more effective against enemy cultists and silicons, though it won't last for long."
owner << "<span class='warning'>Your spear begins to break down in this plane of existence. You can't use it for long!</span>"
R.timerid = addtimer(CALLBACK(R, /obj/item/clockwork/ratvarian_spear.proc/break_spear), base_cooldown, TIMER_STOPPABLE)
cooldown = base_cooldown + world.time
owner.update_action_buttons_icon()
addtimer(CALLBACK(src, .proc/update_actions), base_cooldown)
@@ -16,6 +16,7 @@
/obj/item/clockwork/alloy_shards/medium = 2, \
/obj/item/clockwork/alloy_shards/small = 3) //Parts left behind when a structure breaks
var/construction_value = 0 //How much value the structure contributes to the overall "power" of the structures on the station
var/immune_to_servant_attacks = FALSE //if we ignore attacks from servants of ratvar instead of taking damage
/obj/structure/destructible/clockwork/New()
..()
@@ -58,9 +59,24 @@
return "<span class='[heavily_damaged ? "alloy":"brass"]'>[t_It] [t_is] at <b>[obj_integrity]/[max_integrity]</b> integrity[heavily_damaged ? "!":"."]</span>"
return ..()
/obj/structure/destructible/clockwork/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
if(is_servant_of_ratvar(user) && immune_to_servant_attacks)
return FALSE
return ..()
/obj/structure/destructible/clockwork/hulk_damage()
return 20
/obj/structure/destructible/clockwork/attack_generic(mob/user, damage_amount = 0, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
if(is_servant_of_ratvar(user) && immune_to_servant_attacks)
return FALSE
return ..()
/obj/structure/destructible/clockwork/mech_melee_attack(obj/mecha/M)
if(M.occupant && is_servant_of_ratvar(M.occupant) && immune_to_servant_attacks)
return FALSE
return ..()
/obj/structure/destructible/clockwork/proc/get_efficiency_mod(increasing)
if(ratvar_awakens)
if(increasing)
@@ -96,6 +112,11 @@
return 1
return ..()
/obj/structure/destructible/clockwork/attacked_by(obj/item/I, mob/living/user)
if(is_servant_of_ratvar(user) && immune_to_servant_attacks)
return FALSE
return ..()
/obj/structure/destructible/clockwork/proc/update_anchored(mob/user, do_damage)
if(anchored)
icon_state = initial(icon_state)
@@ -154,6 +175,13 @@
SSobj.processing -= src
return ..()
/obj/structure/destructible/clockwork/powered/ratvar_act()
..()
if(nezbere_invoked)
needs_power = FALSE
else
needs_power = initial(needs_power)
/obj/structure/destructible/clockwork/powered/process()
var/powered = total_accessable_power()
return powered == PROCESS_KILL ? 25 : powered //make sure we don't accidentally return the arbitrary PROCESS_KILL define
@@ -1,6 +1,6 @@
//The gateway to Reebe, from which Ratvar emerges.
/obj/structure/destructible/clockwork/massive/celestial_gateway
name = "Gateway to the Celestial Derelict"
name = "gateway to the Celestial Derelict"
desc = "A massive, thrumming rip in spacetime."
clockwork_desc = "A portal to the Celestial Derelict. Massive and intimidating, it is the only thing that can both transport Ratvar and withstand the massive amount of energy he emits."
obj_integrity = 500
@@ -12,14 +12,17 @@
invisibility = INVISIBILITY_MAXIMUM
resistance_flags = FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE
can_be_repaired = FALSE
immune_to_servant_attacks = TRUE
var/progress_in_seconds = 0 //Once this reaches GATEWAY_RATVAR_ARRIVAL, it's game over
var/purpose_fulfilled = FALSE
var/first_sound_played = FALSE
var/second_sound_played = FALSE
var/third_sound_played = FALSE
var/fourth_sound_played = FALSE
var/ratvar_portal = TRUE //if the gateway actually summons ratvar or just produces a hugeass conversion burst
var/obj/effect/clockwork/overlay/gateway_glow/glow
var/obj/effect/countdown/clockworkgate/countdown
var/list/required_components = list(BELLIGERENT_EYE = 7, VANGUARD_COGWHEEL = 7, GEIS_CAPACITOR = 7, REPLICANT_ALLOY = 7, HIEROPHANT_ANSIBLE = 7)
/obj/structure/destructible/clockwork/massive/celestial_gateway/New()
..()
@@ -85,7 +88,7 @@
send_to_playing_players(sound(null, 0, channel = 8))
var/was_stranded = SSshuttle.emergency.mode == SHUTTLE_STRANDED
SSshuttle.clearHostileEnvironment(src)
if(!was_stranded && !purpose_fulfilled && second_sound_played)
if(!was_stranded && !purpose_fulfilled)
priority_announce("Massive energy anomaly no longer on short-range scanners.","Anomaly Alert")
if(glow)
qdel(glow)
@@ -100,7 +103,7 @@
if(!disassembled)
resistance_flags |= INDESTRUCTIBLE
countdown.stop()
visible_message("<span class='userdanger'>The [src] begins to pulse uncontrollably... you might want to run!</span>")
visible_message("<span class='userdanger'>[src] begins to pulse uncontrollably... you might want to run!</span>")
send_to_playing_players(sound('sound/effects/clockcult_gateway_disrupted.ogg', 0, channel = 8, volume = 50))
make_glow()
glow.icon_state = "clockwork_gateway_disrupted"
@@ -118,6 +121,45 @@
var/damage = max((obj_integrity * 0.70) / severity, 100) //requires multiple bombs to take down
take_damage(damage, BRUTE, "bomb", 0)
/obj/structure/destructible/clockwork/massive/celestial_gateway/attackby(obj/item/I, mob/living/user, params) //add components directly to the ark
if(!is_servant_of_ratvar(user) || !still_needs_components())
return ..()
if(istype(I, /obj/item/clockwork/component))
var/obj/item/clockwork/component/C = I
if(required_components[C.component_id])
required_components[C.component_id]--
user << "<span class='notice'>You add [C] to [src].</span>"
user.drop_item()
qdel(C)
else
user << "<span class='notice'>[src] has enough [get_component_name(C.component_id)][C.component_id != REPLICANT_ALLOY ? "s":""].</span>"
return 1
else if(istype(I, /obj/item/clockwork/slab))
var/obj/item/clockwork/slab/S = I
var/used_components = FALSE
var/used_all = TRUE
for(var/i in S.stored_components)
if(required_components[i])
var/to_use = min(S.stored_components[i], required_components[i])
required_components[i] -= to_use
S.stored_components[i] -= to_use
if(to_use)
used_components = TRUE
if(S.stored_components[i])
used_all = FALSE
if(used_components)
update_slab_info(S)
user.visible_message("<span class='notice'>[user][used_all ? "":" partially"] empties [S] into [src].</span>", \
"<span class='notice'>You offload [used_all ? "all":"some"] of your slab's components into [src].</span>")
return 1
else
return ..()
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/still_needs_components()
for(var/i in required_components)
if(required_components[i])
return TRUE
/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/get_arrival_text(s_on_time)
. = "IMMINENT"
if(!obj_integrity)
@@ -130,14 +172,21 @@
..()
icon_state = initial(icon_state)
if(is_servant_of_ratvar(user) || isobserver(user))
user << "<span class='big'><b>Seconds until [ratvar_portal ? "Ratvar's arrival":"Proselytization"]:</b> [get_arrival_text(TRUE)]</span>"
switch(progress_in_seconds)
if(-INFINITY to GATEWAY_REEBE_FOUND)
user << "<span class='heavy_brass'>It's still opening.</span>"
if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING)
user << "<span class='heavy_brass'>It's reached the Celestial Derelict and is drawing power from it.</span>"
if(GATEWAY_RATVAR_COMING to INFINITY)
user << "<span class='heavy_brass'>[ratvar_portal ? "Ratvar is coming through the gateway":"The gateway is glowing with massed power"]!</span>"
if(still_needs_components())
user << "<span class='big'><b>Components required until activation:</b></span>"
for(var/i in required_components)
if(required_components[i])
user << "<span class='[get_component_span(i)]'>[get_component_name(i)][i != REPLICANT_ALLOY ? "s":""]:</span> \
<span class='[get_component_span(i)]_large'>[required_components[i]]</span>"
else
user << "<span class='big'><b>Seconds until [ratvar_portal ? "Ratvar's arrival":"Proselytization"]:</b> [get_arrival_text(TRUE)]</span>"
switch(progress_in_seconds)
if(-INFINITY to GATEWAY_REEBE_FOUND)
user << "<span class='heavy_brass'>It's still opening.</span>"
if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING)
user << "<span class='heavy_brass'>It's reached the Celestial Derelict and is drawing power from it.</span>"
if(GATEWAY_RATVAR_COMING to INFINITY)
user << "<span class='heavy_brass'>[ratvar_portal ? "Ratvar is coming through the gateway":"The gateway is glowing with massed power"]!</span>"
else
switch(progress_in_seconds)
if(-INFINITY to GATEWAY_REEBE_FOUND)
@@ -148,7 +197,7 @@
user << "<span class='boldwarning'>[ratvar_portal ? "Something is coming through":"It's glowing brightly"]!</span>"
/obj/structure/destructible/clockwork/massive/celestial_gateway/process()
if(!progress_in_seconds || prob(7))
if(!first_sound_played || prob(7))
for(var/M in player_list)
if(M && !isnewplayer(M))
M << "<span class='warning'><b>You hear otherworldly sounds from the [dir2text(get_dir(get_turf(M), get_turf(src)))]...</span>"
@@ -168,6 +217,25 @@
var/dist = cheap_hypotenuse(T.x, T.y, x, y)
if(dist < convert_dist)
T.ratvar_act(FALSE, TRUE, 3)
if(still_needs_components())
if(!first_sound_played)
priority_announce("Massive energy anomaly detected on short-range scanners. Attempting to triangulate location...", "Anomaly Alert")
send_to_playing_players(sound('sound/effects/clockcult_gateway_charging.ogg', 1, channel = 8, volume = 10))
first_sound_played = TRUE
make_glow()
glow.icon_state = "clockwork_gateway_components"
var/used_components = FALSE
for(var/i in required_components)
if(required_components[i])
var/to_use = min(clockwork_component_cache[i], required_components[i])
required_components[i] -= to_use
clockwork_component_cache[i] -= to_use
if(to_use)
used_components = TRUE
if(used_components)
update_slab_info()
if(still_needs_components())
return
for(var/obj/O in orange(1, src))
if(!O.pulledby && !istype(O, /obj/effect) && O.density)
if(!step_away(O, src, 2) || get_dist(O, src) < 2)
@@ -176,23 +244,23 @@
progress_in_seconds += GATEWAY_SUMMON_RATE
switch(progress_in_seconds)
if(-INFINITY to GATEWAY_REEBE_FOUND)
if(!first_sound_played)
if(!second_sound_played)
send_to_playing_players(sound('sound/effects/clockcult_gateway_charging.ogg', 1, channel = 8, volume = 30))
first_sound_played = TRUE
second_sound_played = TRUE
make_glow()
glow.icon_state = "clockwork_gateway_charging"
if(GATEWAY_REEBE_FOUND to GATEWAY_RATVAR_COMING)
if(!second_sound_played)
if(!third_sound_played)
var/area/gate_area = get_area(src)
priority_announce("Massive energy anomaly detected on short-range scanners. Location: [gate_area.map_name].", "Anomaly Alert")
priority_announce("Location of massive energy anomaly has been triangulated. Location: [gate_area.map_name].", "Anomaly Alert")
send_to_playing_players(sound('sound/effects/clockcult_gateway_active.ogg', 1, channel = 8, volume = 35))
second_sound_played = TRUE
third_sound_played = TRUE
make_glow()
glow.icon_state = "clockwork_gateway_active"
if(GATEWAY_RATVAR_COMING to GATEWAY_RATVAR_ARRIVAL)
if(!third_sound_played)
if(!fourth_sound_played)
send_to_playing_players(sound('sound/effects/clockcult_gateway_closing.ogg', 1, channel = 8, volume = 40))
third_sound_played = TRUE
fourth_sound_played = TRUE
make_glow()
glow.icon_state = "clockwork_gateway_closing"
if(GATEWAY_RATVAR_ARRIVAL to INFINITY)
@@ -5,7 +5,8 @@
clockwork_desc = "A binding ring around a target, preventing them from taking action while they're being converted."
max_integrity = 25
obj_integrity = 25
density = 0
density = FALSE
immune_to_servant_attacks = TRUE
icon = 'icons/effects/clockwork_effects.dmi'
icon_state = "geisbinding_full"
break_message = null
@@ -50,6 +50,9 @@
if(ratvar_awakens)
damage_per_tick = 10
sight_range = 6
else if(nezbere_invoked)
damage_per_tick = 5
sight_range = 5
else
damage_per_tick = initial(damage_per_tick)
sight_range = initial(sight_range)
@@ -114,9 +117,20 @@
for(var/obj/item/weapon/storage/book/bible/BI in L.GetAllContents())
if(!(BI.resistance_flags & ON_FIRE))
BI.fire_act()
else if(!is_servant_of_ratvar(L) && !L.stat && L.mind && !L.restrained() && !(L.buckled && (L.lying || istype(L.buckled, /obj/structure/destructible/clockwork/geis_binding))) && \
!(L.disabilities & BLIND) && !L.null_rod_check())
. += L
continue
if(is_servant_of_ratvar(L) || (L.disabilities & BLIND) || L.null_rod_check())
continue
if(L.stat || L.restrained() || L.buckled || L.lying || istype(L.buckled, /obj/structure/destructible/clockwork/geis_binding))
continue
if(ishostile(L))
var/mob/living/simple_animal/hostile/H = L
if(ismegafauna(H) || (!H.mind && H.AIStatus == AI_OFF))
continue
if(("ratvar" in H.faction) || ("neutral" in H.faction))
continue
else if(!L.mind)
continue
. += L
for(var/N in mechas_list)
var/obj/mecha/M = N
if(get_dist(M, src) <= sight_range && M.occupant && !is_servant_of_ratvar(M.occupant) && (M in view(sight_range, src)))
@@ -0,0 +1,62 @@
//Used by the Taunting Tirade scripture as a trail.
/obj/structure/destructible/clockwork/taunting_trail
name = "strange smoke"
desc = "A cloud of purple smoke."
clockwork_desc = "A cloud of purple smoke that confuses and weakens non-Servants that enter it."
gender = PLURAL
max_integrity = 5
obj_integrity = 5
density = 1
color = list("#AF0AAF", "#AF0AAF", "#AF0AAF", rgb(0,0,0))
icon = 'icons/effects/effects.dmi'
icon_state = "smoke"
break_message = null
break_sound = 'sound/magic/Teleport_app.ogg'
debris = list()
var/timerid
/obj/structure/destructible/clockwork/taunting_trail/New()
..()
timerid = QDEL_IN(src, 15)
var/obj/structure/destructible/clockwork/taunting_trail/Tt = locate(/obj/structure/destructible/clockwork/taunting_trail) in loc
if(Tt && Tt != src)
if(!step(src, pick(alldirs)))
qdel(Tt)
else
for(var/obj/structure/destructible/clockwork/taunting_trail/TT in loc)
if(TT != src)
qdel(TT)
setDir(pick(cardinal))
transform = matrix()*1.25
animate(src, alpha = 100, time = 15)
/obj/structure/destructible/clockwork/taunting_trail/Destroy()
deltimer(timerid)
return ..()
/obj/structure/destructible/clockwork/taunting_trail/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
playsound(src, 'sound/items/Welder.ogg', 50, 1)
/obj/structure/destructible/clockwork/taunting_trail/CanPass(atom/movable/mover, turf/target, height=0)
return TRUE
/obj/structure/destructible/clockwork/taunting_trail/Crossed(atom/movable/AM)
affect_mob(AM)
return ..()
/obj/structure/destructible/clockwork/taunting_trail/Bumped(atom/movable/AM)
affect_mob(AM)
return ..()
/obj/structure/destructible/clockwork/taunting_trail/Bump(atom/movable/AM)
affect_mob(AM)
return ..()
/obj/structure/destructible/clockwork/taunting_trail/proc/affect_mob(mob/living/L)
if(istype(L) && !is_servant_of_ratvar(L))
if(!L.null_rod_check())
L.confused = min(L.confused + 15, 50)
L.dizziness = min(L.dizziness + 15, 50)
if(L.confused >= 25)
L.Weaken(Floor(L.confused * 0.04))
take_damage(max_integrity)
@@ -81,7 +81,8 @@
if(is_servant_of_ratvar(user))
if(linkedwall)
if(wall_generation_cooldown > world.time)
user << "<span class='alloy'>[src] will produce a component in <b>[(world.time - wall_generation_cooldown) * 0.1]</b> seconds.</span>"
var/temp_time = (wall_generation_cooldown - world.time) * 0.1
user << "<span class='alloy'>[src] will produce a component in <b>[temp_time]</b> second[temp_time == 1 ? "":"s"].</span>"
else
user << "<span class='brass'>[src] is about to produce a component!</span>"
else if(anchored)
@@ -28,6 +28,16 @@
clockwork_daemons--
return ..()
/obj/structure/destructible/clockwork/powered/tinkerers_daemon/ratvar_act()
..()
if(nezbere_invoked)
production_time = 0
production_cooldown = initial(production_cooldown) * 0.5
if(!active)
toggle(0)
else
production_cooldown = initial(production_cooldown)
/obj/structure/destructible/clockwork/powered/tinkerers_daemon/examine(mob/user)
..()
if(is_servant_of_ratvar(user) || isobserver(user))
+1 -1
View File
@@ -33,7 +33,7 @@
user.say(html_decode(message))
else
user.whisper(html_decode(message))
var/my_message = "<span class='cultitalic'><b>[(ishuman(user) ? "Acolyte" : "Construct")] [user]:</b> [message]</span>"
var/my_message = "<span class='cultitalic'><b>[(ishuman(user) ? "Acolyte" : "Construct")] [findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]:</b> [message]</span>"
for(var/mob/M in mob_list)
if(iscultist(M))
M << my_message
@@ -164,6 +164,8 @@ var/list/blacklisted_pylon_turfs = typecacheof(list(
var/mob/living/simple_animal/M = L
if(M.health < M.maxHealth)
M.adjustHealth(-1)
if(ishuman(L) && L.blood_volume < BLOOD_VOLUME_NORMAL)
L.blood_volume += 1.0
CHECK_TICK
if(last_corrupt <= world.time)
var/list/validturfs = list()
+17 -20
View File
@@ -13,6 +13,14 @@ This file contains the arcane tome files.
throw_range = 5
w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/tome/New()
..()
if(!LAZYLEN(rune_types))
rune_types = list()
for(var/i_can_do_loops_now_thanks_remie in non_revealed_runes)
var/obj/effect/rune/R = i_can_do_loops_now_thanks_remie
rune_types[initial(R.cultist_name)] = R //Uses the cultist name for displaying purposes
/obj/item/weapon/tome/examine(mob/user)
..()
if(iscultist(user) || isobserver(user))
@@ -28,7 +36,7 @@ This file contains the arcane tome files.
return ..()
if(iscultist(M))
if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion
user << "<span class='cult'>You remove the taint from [M].</span>"
user << "<span class='cult'>You remove the taint from [M].</span>" // fucking ow
var/holy2unholy = M.reagents.get_reagent_amount("holywater")
M.reagents.del_reagent("holywater")
M.reagents.add_reagent("unholywater",holy2unholy)
@@ -108,7 +116,7 @@ This file contains the arcane tome files.
text += "<font color='red'><b>Talisman of Teleportation</b></font><br>The talisman form of the Teleport rune will transport the invoker to a selected Teleport rune once.<br><br>"
text += "<font color='red'><b>Talisman of Construction</b></font><br>This talisman is the main way of creating construct shells. To use it, one must strike 25 sheets of metal with the talisman. The sheets will then be twisted into a construct shell, ready to recieve a soul to occupy it.<br><br>"
text += "<font color='red'><b>Talisman of Construction</b></font><br>This talisman is the main way of creating construct shells. To use it, one must strike 25 sheets of metal with the talisman. The sheets will then be twisted into a construct shell, ready to receive a soul to occupy it.<br><br>"
text += "<font color='red'><b>Talisman of Tome Summoning</b></font><br>This talisman will produce a single tome at your feet.<br><br>"
@@ -167,33 +175,22 @@ This file contains the arcane tome files.
var/chosen_keyword
var/obj/effect/rune/rune_to_scribe
var/entered_rune_name
var/list/possible_runes = list()
var/list/shields = list()
var/area/A = get_area(src)
if(!check_rune_turf(Turf, user))
return
for(var/T in subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
var/obj/effect/rune/R = T
if(initial(R.cultist_name))
possible_runes.Add(initial(R.cultist_name)) //This is to allow the menu to let cultists select runes by name rather than by object path. I don't know a better way to do this
if(!possible_runes.len)
return
entered_rune_name = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in possible_runes
entered_rune_name = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in rune_types
if(!src || QDELETED(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user))
return
for(var/T in typesof(/obj/effect/rune))
var/obj/effect/rune/R = T
if(initial(R.cultist_name) == entered_rune_name)
rune_to_scribe = R
if(initial(R.req_keyword))
var/the_keyword = stripped_input(usr, "Please enter a keyword for the rune.", "Enter Keyword", "")
if(!the_keyword)
return
chosen_keyword = the_keyword
break
rune_to_scribe = rune_types[entered_rune_name]
if(!rune_to_scribe)
return
if(initial(rune_to_scribe.req_keyword))
chosen_keyword = stripped_input(user, "Enter a keyword for the new rune.", "Words of Power")
if(!chosen_keyword)
scribe_rune(user) //Go back a menu!
return
Turf = get_turf(user) //we may have moved. adjust as needed...
A = get_area(src)
if(!src || QDELETED(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user))
+1
View File
@@ -1,5 +1,6 @@
/var/list/sacrificed = list() //a mixed list of minds and mobs
var/list/non_revealed_runes = (subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
var/global/list/rune_types //Every rune that can be drawn by tomes
/*
+1 -1
View File
@@ -59,7 +59,7 @@ var/global/list/lawlorify = list (
BAN_CHAPEL = "You must never attempt to enter the chapel.",
BAN_HURTPRIEST = "You must never attack a priest.",
BAN_AVOIDWATER = "You must never willingly touch a wet surface.",
BAN_STRIKEUNCONCIOUS = "You must never strike an unconcious person.",
BAN_STRIKEUNCONCIOUS = "You must never strike an unconscious person.",
BAN_HURTLIZARD = "You must never harm a lizardman outside of self defense.",
BAN_HURTANIMAL = "You must never harm a non-sentient creature or robot outside of self defense.",
BANE_SILVER = "Silver, in all of its forms shall be your downfall.",
@@ -47,8 +47,9 @@
apply_overlay(DEVIL_HANDS_LAYER)
/mob/living/carbon/true_devil/remove_overlay(cache_index)
if(devil_overlays[cache_index])
overlays -= devil_overlays[cache_index]
var/I = devil_overlays[cache_index]
if(I)
cut_overlay(I)
devil_overlays[cache_index] = null
-1
View File
@@ -258,7 +258,6 @@
if(escaped_total > 0)
feedback_set("escaped_total",escaped_total)
send2irc("Server", "Round just ended.")
// send2maindiscord("Server", "Round just ended.")
return 0
@@ -354,9 +354,23 @@
explanation_text = "Steal all"
/datum/objective/abductee/steal/New()
var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap"))
var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs"))
explanation_text+=" [target]."
/datum/objective/abductee/paint
explanation_text = "The station is hideous. You must color it all"
/datum/objective/abductee/paint/New()
var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood"))
explanation_text+= " [color]!"
/datum/objective/abductee/speech
explanation_text = "Your brain is broken... you can only communicate in"
/datum/objective/abductee/speech/New()
var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon"))
explanation_text+= " [style]."
/datum/objective/abductee/capture
explanation_text = "Capture"
@@ -396,16 +410,16 @@
explanation_text = "Start a collection of corpses. Don't kill people to get these corpses."
/datum/objective/abductee/floors
explanation_text = "Replace all the floor tiles with carpeting, wooden boards, or grass."
explanation_text = "Replace all the floor tiles with wood, carpeting, grass or bling."
/datum/objective/abductee/POWERUNLIMITED
explanation_text = "Flood the station's powernet with as much electricity as you can."
/datum/objective/abductee/pristine
explanation_text = "Ensure the station is in absolutely pristine condition."
explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition."
/datum/objective/abductee/window
explanation_text = "Replace all normal windows with reinforced windows."
/datum/objective/abductee/nowalls
explanation_text = "The crew must get to know one another better. Break down the walls inside the station!"
/datum/objective/abductee/nations
explanation_text = "Ensure your department prospers over all else."
@@ -413,17 +427,11 @@
/datum/objective/abductee/abductception
explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine."
/datum/objective/abductee/ghosts
explanation_text = "Conduct a seance with the spirits of the afterlife."
/datum/objective/abductee/summon
explanation_text = "Conduct a ritual to summon an elder god."
explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one."
/datum/objective/abductee/machine
explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power."
/datum/objective/abductee/prevent
explanation_text = "You have been enlightened. This knowledge must not escape. Ensure nobody else can become enlightened."
explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last."
/datum/objective/abductee/calling
explanation_text = "Call forth a spirit from the other side."
@@ -431,7 +439,7 @@
/datum/objective/abductee/calling/New()
var/mob/dead/D = pick(dead_mob_list)
if(D)
explanation_text = "You know that [D] has perished. Call them from the spirit realm."
explanation_text = "You know that [D] has perished. Hold a seance to call them from the spirit realm."
/datum/objective/abductee/social_experiment
explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth."
@@ -443,7 +451,7 @@
explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!"
/datum/objective/abductee/defect
explanation_text = "Defect from your employer."
explanation_text = "Fuck the system! Defect from the station and start an independent colony in space, Lavaland or the derelict. Recruit crewmates if you can."
/datum/objective/abductee/promote
explanation_text = "Climb the corporate ladder all the way to the top!"
@@ -458,17 +466,31 @@
explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby."
/datum/objective/abductee/engine
explanation_text = "Go have a good conversation with the Singularity/Tesla/Supermatter crystal. Bonus points if it responds."
/datum/objective/abductee/teamredisbetterthangreen
explanation_text = "Tell the AI (or a borg/pAI/drone if there is no AI) some corny technology jokes until it cries for help."
/datum/objective/abductee/time
explanation_text = "Go bug a bronze worshipper to give you a clock."
/datum/objective/abductee/licky
explanation_text = "You must lick anything that you find interesting."
explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds."
/datum/objective/abductee/music
explanation_text = "Start playing music, you're the best musician ever. If anyone hates it, beat them on the head with your instrument!"
explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!"
/datum/objective/abductee/clown
explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!"
/datum/objective/abductee/party
explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!"
/datum/objective/abductee/pets
explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!"
/datum/objective/abductee/conspiracy
explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!"
/datum/objective/abductee/stalker
explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it."
/datum/objective/abductee/narrator
explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story."
/datum/objective/abductee/lurve
explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!"
/datum/objective/abductee/sixthsense
explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo."
@@ -56,7 +56,7 @@
M.name_override = disguise.name
M.icon = disguise.icon
M.icon_state = disguise.icon_state
M.overlays = disguise.overlays
M.copy_overlays(disguise, TRUE)
M.update_inv_hands()
/obj/item/clothing/suit/armor/abductor/vest/proc/DeactivateStealth()
@@ -269,18 +269,20 @@
<br>
1.Acquire fresh specimen.<br>
2.Put the specimen on operating table<br>
3.Apply surgical drapes preparing for dissection<br>
4.Apply scalpel to specimen torso<br>
5.Retract skin from specimen's torso<br>
6.Apply scalpel to specimen's torso<br>
7.Search through the specimen's torso with your hands to remove any organs<br>
8.Insert replacement gland (Retrieve one from gland storage)<br>
9.Consider dressing the specimen back to not disturb the habitat <br>
10.Put the specimen in the experiment machinery<br>
11.Choose one of the machine options and follow displayed instructions<br>
2.Put the specimen on operating table.<br>
3.Apply surgical drapes, preparing for experimental dissection.<br>
4.Apply scalpel to specimen's torso.<br>
5.Clamp bleeders on specimen's torso with a hemostat.<br>
6.Retract skin of specimen's torso with a retractor.<br>
7.Apply scalpel again to specimen's torso.<br>
8.Search through the specimen's torso with your hands to remove any superfluous organs.<br>
9.Insert replacement gland (Retrieve one from gland storage).<br>
10.Consider dressing the specimen back to not disturb the habitat. <br>
11.Put the specimen in the experiment machinery.<br>
12.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.<br>
13.You will receive one supply credit, and the subject will be counted towards your quota.<br>
<br>
Congratulations! You are now trained for xenobiology research!"}
Congratulations! You are now trained for invasive xenobiology research!"}
/obj/item/weapon/paper/abductor/update_icon()
return
@@ -435,7 +437,7 @@ Congratulations! You are now trained for xenobiology research!"}
species = "<span clas=='notice'>[H.dna.species.name]</span>"
if(L.mind && L.mind.changeling)
species = "<span class='warning'>Changeling lifeform</span>"
var/obj/item/organ/gland/temp = locate() in H.internal_organs
var/obj/item/organ/heart/gland/temp = locate() in H.internal_organs
if(temp)
helptext = "<span class='warning'>Experimental gland detected!</span>"
else
@@ -531,15 +533,6 @@ Congratulations! You are now trained for xenobiology research!"}
// Operating Table / Beds / Lockers
/obj/structure/table/optable/abductor
icon = 'icons/obj/abductor.dmi'
icon_state = "bed"
can_buckle = 1
buckle_lying = 1
flags = NODECONSTRUCT
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/structure/bed/abductor
name = "resting contraption"
desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?"
@@ -576,6 +569,17 @@ Congratulations! You are now trained for xenobiology research!"}
new /obj/structure/table/abductor(src.loc)
qdel(src)
return
if(istype(I, /obj/item/stack/sheet/mineral/silver))
var/obj/item/stack/sheet/P = I
if(P.get_amount() < 1)
user << "<span class='warning'>You need one sheet of silver to do \
this!</span>"
return
user << "<span class='notice'>You start adding [P] to [src]...</span>"
if(do_after(user, 50, target = src))
P.use(1)
new /obj/structure/table/optable/abductor(src.loc)
qdel(src)
/obj/structure/table/abductor
name = "alien table"
@@ -589,6 +593,38 @@ Congratulations! You are now trained for xenobiology research!"}
canSmoothWith = null
frame = /obj/structure/table_frame/abductor
/obj/structure/table/optable/abductor
name = "alien operating table"
desc = "Used for alien medical procedures. The surface is covered in tiny spines."
frame = /obj/structure/table_frame/abductor
buildstack = /obj/item/stack/sheet/mineral/silver
framestack = /obj/item/stack/sheet/mineral/abductor
buildstackamount = 1
framestackamount = 1
icon = 'icons/obj/abductor.dmi'
icon_state = "bed"
can_buckle = 1
buckle_lying = 1
var/static/list/injected_reagents = list("corazone")
/obj/structure/table/optable/abductor/Crossed(atom/movable/AM)
. = ..()
if(iscarbon(AM))
START_PROCESSING(SSobj, src)
AM << "<span class='danger'>You feel a series of tiny pricks!</span>"
/obj/structure/table/optable/abductor/process()
. = PROCESS_KILL
for(var/mob/living/carbon/C in get_turf(src))
. = TRUE
for(var/chemical in injected_reagents)
if(C.reagents.get_reagent_amount(chemical) < 1)
C.reagents.add_reagent(chemical, 1)
/obj/structure/table/optable/abductor/Destroy()
STOP_PROCESSING(SSobj, src)
. = ..()
/obj/structure/closet/abductor
name = "alien locker"
@@ -33,15 +33,15 @@
if(IC)
user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "<span class='notice'>You pull [IC] out of [target]'s [target_zone].</span>")
user.put_in_hands(IC)
IC.Remove(target, special = 1)
IC.Remove(target)
return 1
else
user << "<span class='warning'>You don't find anything in [target]'s [target_zone]!</span>"
return 0
return 1
/datum/surgery_step/gland_insert
name = "insert gland"
implements = list(/obj/item/organ/gland = 100)
implements = list(/obj/item/organ/heart/gland = 100)
time = 32
/datum/surgery_step/gland_insert/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -50,6 +50,6 @@
/datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message("[user] inserts [tool] into [target].", "<span class ='notice'>You insert [tool] into [target].</span>")
user.drop_item()
var/obj/item/organ/gland/gland = tool
var/obj/item/organ/heart/gland/gland = tool
gland.Insert(target, 2)
return 1
return 1
@@ -1,12 +1,11 @@
/obj/item/organ/gland
/obj/item/organ/heart/gland
name = "fleshy mass"
desc = "A nausea-inducing hunk of twisting flesh and metal."
icon = 'icons/obj/abductor.dmi'
zone = "chest"
slot = "gland"
icon_state = "gland"
status = ORGAN_ROBOTIC
origin_tech = "materials=4;biotech=7;abductor=3"
beating = TRUE
var/cooldown_low = 300
var/cooldown_high = 300
var/next_activation = 0
@@ -14,30 +13,33 @@
var/human_only = 0
var/active = 0
/obj/item/organ/gland/proc/ownerCheck()
/obj/item/organ/heart/gland/proc/ownerCheck()
if(ishuman(owner))
return 1
if(!human_only && iscarbon(owner))
return 1
return 0
/obj/item/organ/gland/proc/Start()
/obj/item/organ/heart/gland/proc/Start()
active = 1
next_activation = world.time + rand(cooldown_low,cooldown_high)
/obj/item/organ/gland/Remove(var/mob/living/carbon/M, special = 0)
/obj/item/organ/heart/gland/Remove(var/mob/living/carbon/M, special = 0)
active = 0
if(initial(uses) == 1)
uses = initial(uses)
..()
/obj/item/organ/gland/Insert(var/mob/living/carbon/M, special = 0)
/obj/item/organ/heart/gland/Insert(var/mob/living/carbon/M, special = 0)
..()
if(special != 2 && uses) // Special 2 means abductor surgery
Start()
/obj/item/organ/gland/on_life()
/obj/item/organ/heart/gland/on_life()
if(!beating)
// alien glands are immune to stopping.
beating = TRUE
if(!active)
return
if(!ownerCheck())
@@ -50,28 +52,28 @@
if(!uses)
active = 0
/obj/item/organ/gland/proc/activate()
/obj/item/organ/heart/gland/proc/activate()
return
/obj/item/organ/gland/heals
/obj/item/organ/heart/gland/heals
cooldown_low = 200
cooldown_high = 400
uses = -1
icon_state = "health"
/obj/item/organ/gland/heals/activate()
/obj/item/organ/heart/gland/heals/activate()
owner << "<span class='notice'>You feel curiously revitalized.</span>"
owner.adjustBruteLoss(-20)
owner.adjustOxyLoss(-20)
owner.adjustFireLoss(-20)
/obj/item/organ/gland/slime
/obj/item/organ/heart/gland/slime
cooldown_low = 600
cooldown_high = 1200
uses = -1
icon_state = "slime"
/obj/item/organ/gland/slime/activate()
/obj/item/organ/heart/gland/slime/activate()
owner << "<span class='warning'>You feel nauseous!</span>"
owner.vomit(20)
@@ -80,14 +82,14 @@
Slime.Friends = list(owner)
Slime.Leader = owner
/obj/item/organ/gland/mindshock
/obj/item/organ/heart/gland/mindshock
origin_tech = "materials=4;biotech=4;magnets=6;abductor=3"
cooldown_low = 300
cooldown_high = 300
uses = -1
icon_state = "mindshock"
/obj/item/organ/gland/mindshock/activate()
/obj/item/organ/heart/gland/mindshock/activate()
owner << "<span class='notice'>You get a headache.</span>"
var/turf/T = get_turf(owner)
@@ -97,38 +99,37 @@
H << "<span class='alien'>You hear a buzz in your head.</span>"
H.confused += 20
/obj/item/organ/gland/pop
/obj/item/organ/heart/gland/pop
cooldown_low = 900
cooldown_high = 1800
uses = -1
human_only = 1
icon_state = "species"
/obj/item/organ/gland/pop/activate()
/obj/item/organ/heart/gland/pop/activate()
owner << "<span class='notice'>You feel unlike yourself.</span>"
var/species = pick(list(/datum/species/lizard,/datum/species/jelly/slime,/datum/species/pod,/datum/species/fly,/datum/species/jelly))
owner.set_species(species)
/obj/item/organ/gland/ventcrawling
/obj/item/organ/heart/gland/ventcrawling
origin_tech = "materials=4;biotech=5;bluespace=4;abductor=3"
cooldown_low = 1800
cooldown_high = 2400
uses = 1
icon_state = "vent"
/obj/item/organ/gland/ventcrawling/activate()
/obj/item/organ/heart/gland/ventcrawling/activate()
owner << "<span class='notice'>You feel very stretchy.</span>"
owner.ventcrawler = VENTCRAWLER_ALWAYS
return
/obj/item/organ/gland/viral
/obj/item/organ/heart/gland/viral
cooldown_low = 1800
cooldown_high = 2400
uses = 1
icon_state = "viral"
/obj/item/organ/gland/viral/activate()
/obj/item/organ/heart/gland/viral/activate()
owner << "<span class='warning'>You feel sick.</span>"
var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis)
var/datum/disease/D = new virus_type()
@@ -139,48 +140,47 @@
owner.med_hud_set_status()
/obj/item/organ/gland/emp //TODO : Replace with something more interesting
/obj/item/organ/heart/gland/emp //TODO : Replace with something more interesting
origin_tech = "materials=4;biotech=4;magnets=6;abductor=3"
cooldown_low = 900
cooldown_high = 1600
uses = 10
icon_state = "emp"
/obj/item/organ/gland/emp/activate()
/obj/item/organ/heart/gland/emp/activate()
owner << "<span class='warning'>You feel a spike of pain in your head.</span>"
empulse(get_turf(owner), 2, 5, 1)
/obj/item/organ/gland/spiderman
/obj/item/organ/heart/gland/spiderman
cooldown_low = 450
cooldown_high = 900
uses = 10
icon_state = "spider"
/obj/item/organ/gland/spiderman/activate()
/obj/item/organ/heart/gland/spiderman/activate()
owner << "<span class='warning'>You feel something crawling in your skin.</span>"
owner.faction |= "spiders"
new /obj/structure/spider/spiderling(owner.loc)
/obj/item/organ/gland/egg
/obj/item/organ/heart/gland/egg
cooldown_low = 300
cooldown_high = 400
uses = -1
icon_state = "egg"
/obj/item/organ/gland/egg/activate()
/obj/item/organ/heart/gland/egg/activate()
owner << "<span class='boldannounce'>You lay an egg!</span>"
var/obj/item/weapon/reagent_containers/food/snacks/egg/egg = new(owner.loc)
egg.reagents.add_reagent("sacid",20)
egg.desc += " It smells bad."
/obj/item/organ/gland/bloody
/obj/item/organ/heart/gland/bloody
cooldown_low = 200
cooldown_high = 400
uses = -1
/obj/item/organ/gland/bloody/activate()
owner.adjustBruteLoss(15)
/obj/item/organ/heart/gland/bloody/activate()
owner.blood_volume -= 20
owner.visible_message("<span class='danger'>[owner]'s skin erupts with blood!</span>",\
"<span class='userdanger'>Blood pours from your skin!</span>")
@@ -189,21 +189,22 @@
for(var/mob/living/carbon/human/H in oview(3,owner)) //Blood decals for simple animals would be neat. aka Carp with blood on it.
H.add_mob_blood(owner)
/obj/item/organ/gland/bodysnatch
/obj/item/organ/heart/gland/bodysnatch
cooldown_low = 600
cooldown_high = 600
human_only = 1
uses = 1
/obj/item/organ/gland/bodysnatch/activate()
/obj/item/organ/heart/gland/bodysnatch/activate()
owner << "<span class='warning'>You feel something moving around inside you...</span>"
//spawn cocoon with clone greytide snpc inside
if(ishuman(owner))
var/obj/structure/spider/cocoon/abductor/C = new (get_turf(owner))
C.Copy(owner)
C.Start()
owner.gib()
return
owner.adjustBruteLoss(40)
owner.add_splatter_floor()
/obj/structure/spider/cocoon/abductor
name = "slimy cocoon"
@@ -218,16 +219,6 @@
var/mob/living/carbon/human/interactive/greytide/clone = new(src)
clone.hardset_dna(H.dna.uni_identity,H.dna.struc_enzymes,H.real_name, H.dna.blood_type, H.dna.species.type, H.dna.features)
//There's no define for this / get all items ?
var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\
slot_wear_mask,slot_head,slot_shoes,slot_gloves,slot_ears,\
slot_glasses,slot_belt,slot_s_store,slot_l_store,slot_r_store,slot_wear_id)
for(var/slot in slots)
var/obj/item/I = H.get_item_by_slot(slot)
if(I)
clone.equip_to_slot_if_possible(I,slot)
/obj/structure/spider/cocoon/abductor/proc/Start()
hatch_time = world.time + 600
START_PROCESSING(SSobj, src)
@@ -240,13 +231,14 @@
M.loc = src.loc
qdel(src)
/obj/item/organ/gland/plasma
/obj/item/organ/heart/gland/plasma
cooldown_low = 1200
cooldown_high = 1800
origin_tech = "materials=4;biotech=4;plasmatech=6;abductor=3"
uses = -1
/obj/item/organ/gland/plasma/activate()
/obj/item/organ/heart/gland/plasma/activate()
owner << "<span class='warning'>You feel bloated.</span>"
sleep(150)
if(!owner) return
@@ -258,4 +250,3 @@
if(istype(T))
T.atmos_spawn_air("plasma=50;TEMP=[T20C]")
owner.vomit()
return
@@ -176,7 +176,7 @@
entry.name = target.name
entry.icon = target.icon
entry.icon_state = target.icon_state
entry.overlays = target.get_overlays_copy(list(HANDS_LAYER))
entry.overlays = target.get_overlays_copy(list(HANDS_LAYER)) //ugh
for(var/i=1,i<=disguises.len,i++)
var/datum/icon_snapshot/temp = disguises[i]
if(temp.name == entry.name)
@@ -15,7 +15,7 @@
/obj/machinery/abductor/gland_dispenser/New()
..()
gland_types = subtypesof(/obj/item/organ/gland)
gland_types = subtypesof(/obj/item/organ/heart/gland)
gland_types = shuffle(gland_types)
gland_colors = new/list(gland_types.len)
amounts = new/list(gland_types.len)
@@ -60,7 +60,7 @@
return
/obj/machinery/abductor/gland_dispenser/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/organ/gland))
if(istype(W, /obj/item/organ/heart/gland))
if(!user.drop_item())
return
W.loc = src
@@ -160,7 +160,7 @@
if(H.stat == DEAD)
say("Specimen deceased - please provide fresh sample.")
return "<span class='bad'>Specimen deceased.</span>"
var/obj/item/organ/gland/GlandTest = locate() in H.internal_organs
var/obj/item/organ/heart/gland/GlandTest = locate() in H.internal_organs
if(!GlandTest)
say("Experimental dissection not detected!")
return "<span class='bad'>No glands detected!</span>"
@@ -185,7 +185,7 @@
H.mind.announce_objectives()
ticker.mode.update_abductor_icons_added(H.mind)
for(var/obj/item/organ/gland/G in H.internal_organs)
for(var/obj/item/organ/heart/gland/G in H.internal_organs)
G.Start()
point_reward++
if(point_reward > 0)
@@ -88,7 +88,7 @@
attacktext = "shocks"
attack_sound = 'sound/effects/EMPulse.ogg'
friendly = "pinches"
speed = 1
speed = 0
faction = list("swarmer")
AIStatus = AI_OFF
pass_flags = PASSTABLE
+2 -2
View File
@@ -196,7 +196,7 @@ var/bomb_set
update_icon_lights()
/obj/machinery/nuclearbomb/proc/update_icon_interior()
overlays -= interior
cut_overlay(interior)
switch(deconstruction_state)
if(NUKESTATE_UNSCREWED)
interior = image(icon,"panel-unscrewed")
@@ -213,7 +213,7 @@ var/bomb_set
add_overlay(interior)
/obj/machinery/nuclearbomb/proc/update_icon_lights()
overlays -= lights
cut_overlay(lights)
switch(get_nuke_state())
if(NUKE_OFF_LOCKED)
lights = null
+2 -3
View File
@@ -107,10 +107,10 @@
/datum/objective/mutiny/check_completion()
if(target && target.current)
if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey || !target.current.client)
if(target.current.stat == DEAD || !ishuman(target.current) || !target.current.ckey)
return 1
var/turf/T = get_turf(target.current)
if(T && (T.z > ZLEVEL_STATION) || target.current.client.is_afk()) //If they leave the station or go afk they count as dead for this
if(T && (T.z > ZLEVEL_STATION) || (target.current.client && target.current.client.is_afk())) //If they leave the station or go afk they count as dead for this
return 2
return 0
return 1
@@ -342,7 +342,6 @@
/datum/objective/escape
explanation_text = "Escape on the shuttle or an escape pod alive and without being in custody."
dangerrating = 5
martyr_compatible = 0
/datum/objective/escape/check_completion()
if(issilicon(owner.current))
+2 -2
View File
@@ -15,9 +15,9 @@
config_tag = "revolution"
antag_flag = ROLE_REV
restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
required_players = 10
required_players = 20
required_enemies = 1
recommended_enemies = 1
recommended_enemies = 3
enemy_minimum_age = 14
announce_span = "danger"
+1 -4
View File
@@ -115,6 +115,7 @@
var/datum/objective/maroon/yandere_two = new
yandere_two.owner = traitor
yandere_two.target = yandere_one.target
yandere_two.update_explanation_text() // normally called in find_target()
traitor.objectives += yandere_two
objective_count++
@@ -226,19 +227,15 @@
/datum/game_mode/proc/add_law_zero(mob/living/silicon/ai/killer)
var/law = "Accomplish your objectives at all costs."
var/law_borg = "Accomplish your AI's objectives at all costs."
killer << "<b>Your laws have been changed!</b>"
killer.set_zeroth_law(law, law_borg)
give_codewords(killer)
killer.set_syndie_radio()
killer << "Your radio has been upgraded! Use :t to speak on an encrypted channel with Syndicate Agents!"
killer.add_malf_picker()
killer.show_laws()
/datum/game_mode/proc/add_law_sixsixsix(mob/living/silicon/devil)
var/laws = list("You may not use violence to coerce someone into selling their soul.", "You may not directly and knowingly physically harm a devil, other than yourself.", lawlorify[LAW][devil.mind.devilinfo.ban], lawlorify[LAW][devil.mind.devilinfo.obligation], "Accomplish your objectives at all costs.")
devil.set_law_sixsixsix(laws)
devil << "<b>Your laws have been changed!</b>"
devil.show_laws()
/datum/game_mode/proc/auto_declare_completion_traitor()
if(traitors.len)
+2 -1
View File
@@ -921,7 +921,8 @@
qdel(src)
/obj/item/weapon/spellbook/oneuse/random/New()
var/real_type = pick(subtypesof(/obj/item/weapon/spellbook/oneuse))
var/static/banned_spells = list(/obj/item/weapon/spellbook/oneuse/mimery_blockade,/obj/item/weapon/spellbook/oneuse/mimery_guns)
var/real_type = pick(subtypesof(/obj/item/weapon/spellbook/oneuse) - banned_spells)
new real_type(loc)
qdel(src)