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
+21 -22
View File
@@ -45,7 +45,6 @@
var/safe = 0 //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers
var/no_air = null
var/area/master // master area used for power calcluations
var/list/related // the other areas of the same type as this
var/parallax_movedir = 0
@@ -98,10 +97,9 @@ var/list/teleportlocs = list()
/area/New()
/area/Initialize()
icon_state = ""
layer = AREA_LAYER
master = src
uid = ++global_uid
related = list(src)
map_name = name // Save the initial (the name set in the map) name of the area.
@@ -238,6 +236,8 @@ var/list/teleportlocs = list()
RA.mouse_opacity = 0
RA.updateicon()
RA.ModifyFiredoors(TRUE)
for(var/obj/machinery/firealarm/F in RA)
F.update_icon()
for (var/mob/living/silicon/aiPlayer in player_list)
aiPlayer.cancelAlarm("Fire", src, source)
@@ -343,17 +343,17 @@ var/list/teleportlocs = list()
/area/proc/powered(chan) // return true if the area has power to given channel
if(!master.requires_power)
if(!requires_power)
return 1
if(master.always_unpowered)
if(always_unpowered)
return 0
switch(chan)
if(EQUIP)
return master.power_equip
return power_equip
if(LIGHT)
return master.power_light
return power_light
if(ENVIRON)
return master.power_environ
return power_environ
return 0
@@ -372,19 +372,19 @@ var/list/teleportlocs = list()
var/used = 0
switch(chan)
if(LIGHT)
used += master.used_light
used += used_light
if(EQUIP)
used += master.used_equip
used += used_equip
if(ENVIRON)
used += master.used_environ
used += used_environ
if(TOTAL)
used += master.used_light + master.used_equip + master.used_environ
used += used_light + used_equip + used_environ
if(STATIC_EQUIP)
used += master.static_equip
used += static_equip
if(STATIC_LIGHT)
used += master.static_light
used += static_light
if(STATIC_ENVIRON)
used += master.static_environ
used += static_environ
return used
/area/proc/addStaticPower(value, powerchannel)
@@ -397,20 +397,19 @@ var/list/teleportlocs = list()
static_environ += value
/area/proc/clear_usage()
master.used_equip = 0
master.used_light = 0
master.used_environ = 0
used_equip = 0
used_light = 0
used_environ = 0
/area/proc/use_power(amount, chan)
switch(chan)
if(EQUIP)
master.used_equip += amount
used_equip += amount
if(LIGHT)
master.used_light += amount
used_light += amount
if(ENVIRON)
master.used_environ += amount
used_environ += amount
/area/Entered(A)
+2 -2
View File
@@ -14,9 +14,9 @@
*/
/area/holodeck/powered(var/chan)
if(!master.requires_power)
if(!requires_power)
return 1
if(master.always_unpowered)
if(always_unpowered)
return 0
if(!linked)
return 0
+16 -10
View File
@@ -18,15 +18,14 @@
//Value used to increment ex_act() if reactionary_explosions is on
var/explosion_block = 0
//overlays that should remain on top and not normally be removed, like c4.
var/list/priority_overlays
var/list/atom_colours //used to store the different colors on an atom
//its inherent color, the colored paint applied on it, special color effect etc...
var/initialized = FALSE
var/list/our_overlays //our local copy of (non-priority) overlays without byond magic. Use procs in SSoverlays to manipulate
var/list/priority_overlays //overlays that should remain on top and not normally removed when using cut_overlay functions, like c4.
/atom/New()
/atom/New(loc, ...)
//atom creation method that preloads variables at creation
if(use_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New()
_preloader.load(src)
@@ -35,15 +34,16 @@
add_atom_colour(color, FIXED_COLOUR_PRIORITY)
//lighting stuff
if(opacity && isturf(loc))
loc.UpdateAffectingLights()
if(opacity && isturf(src.loc))
src.loc.UpdateAffectingLights()
if(luminosity)
light = new(src)
var/do_initialize = SSobj.initialized
if(do_initialize > INITIALIZATION_INSSOBJ)
Initialize(do_initialize == INITIALIZATION_INNEW_MAPLOAD)
var/do_initialize = SSatoms.initialized
if(do_initialize > INITIALIZATION_INSSATOMS)
args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD
Initialize(arglist(args))
//. = ..() //uncomment if you are dumb enough to add a /datum/New() proc
//Called after New if the map is being loaded. mapload = TRUE
@@ -52,11 +52,12 @@
//Derivatives must not sleep
//Returning TRUE while mapload is TRUE will cause the object to be initialized again with mapload = FALSE when everything else is done
//(Useful for things that requires turfs to have air). This base may only be called once, however
//Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE
//Note: the following functions don't call the base for optimization and must copypasta:
// /turf/Initialize
// /turf/open/space/Initialize
/atom/proc/Initialize(mapload)
/atom/proc/Initialize(mapload, ...)
if(initialized)
stack_trace("Warning: [src]([type]) initialized multiple times!")
initialized = TRUE
@@ -74,6 +75,11 @@
AA.hide(list(src))
if(reagents)
qdel(reagents)
LAZYCLEARLIST(overlays)
LAZYCLEARLIST(priority_overlays)
//SSoverlays.processing -= src //we COULD do this, but it's better to just let it fall out of the processing queue
return ..()
/atom/proc/CanPass(atom/movable/mover, turf/target, height=1.5)
+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)
@@ -53,18 +53,12 @@ var/list/announcement_systems = list()
cut_overlays()
if(arrivalToggle)
add_overlay(greenlight)
else
overlays -= greenlight
if(newheadToggle)
add_overlay(pinklight)
else
overlays -= pinklight
if(stat & BROKEN)
add_overlay(errorlight)
else
overlays -= errorlight
/obj/machinery/announcement_system/Destroy()
qdel(radio)
@@ -98,7 +98,7 @@
C.setDir(src.dir)
C.network = tempnetwork
var/area/A = get_area_master(src)
var/area/A = get_area(src)
C.c_tag = "[A.name] ([rand(1, 999)])"
+88 -75
View File
@@ -4,6 +4,7 @@
//Potential replacement for genetics revives or something I dunno (?)
#define CLONE_INITIAL_DAMAGE 190 //Clones in clonepods start with 190 cloneloss damage and 190 brainloss damage, thats just logical
#define MINIMUM_HEAL_LEVEL 40
#define SPEAK(message) radio.talk_into(src, message, radio_channel, get_spans())
@@ -16,12 +17,10 @@
icon_state = "pod_0"
req_access = list(access_cloning) //For premature unlocking.
verb_say = "states"
var/heal_level = 90 //The clone is released once its health reaches this level.
var/locked = FALSE
var/heal_level //The clone is released once its health reaches this level.
var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine.
var/mess = FALSE //Need to clean out it if it's full of exploded clone.
var/attempting = FALSE //One clone attempt at a time thanks
var/eject_wait = FALSE //Don't eject them as soon as they are created fuckkk
var/speed_coeff
var/efficiency
@@ -34,6 +33,13 @@
var/obj/effect/countdown/clonepod/countdown
var/list/unattached_flesh
var/flesh_number = 0
// The "brine" is the reagents that are automatically added in small
// amounts to the occupant.
var/static/list/brine_types = list("salbutamol", "bicaridine", "corazone")
/obj/machinery/clonepod/New()
..()
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/clonepod(null)
@@ -55,6 +61,10 @@
countdown = null
if(connected)
connected.DetachCloner(src)
for(var/i in unattached_flesh)
qdel(i)
LAZYCLEARLIST(unattached_flesh)
unattached_flesh = null
. = ..()
/obj/machinery/clonepod/RefreshParts()
@@ -65,6 +75,8 @@
for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts)
speed_coeff += P.rating
heal_level = (efficiency * 15) + 10
if(heal_level < MINIMUM_HEAL_LEVEL)
heal_level = MINIMUM_HEAL_LEVEL
if(heal_level > 100)
heal_level = 100
@@ -137,18 +149,14 @@
return FALSE
if(clonemind.damnation_type) //Can't clone the damned.
INVOKE_ASYNC(src, .proc/horrifyingsound)
mess = 1
mess = TRUE
icon_state = "pod_g"
update_icon()
return FALSE
attempting = TRUE //One at a time!!
locked = TRUE
countdown.start()
eject_wait = TRUE
addtimer(CALLBACK(src, .proc/wait_complete), 30)
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
H.hardset_dna(ui, se, H.real_name, null, mrace, features)
@@ -172,8 +180,8 @@
icon_state = "pod_1"
//Get the clone body ready
H.setCloneLoss(CLONE_INITIAL_DAMAGE) //Yeah, clones start with very low health, not with random, because why would they start with random health
H.setBrainLoss(CLONE_INITIAL_DAMAGE)
maim_clone(H)
check_brine() // put in chemicals NOW to stop death via cardiac arrest
H.Paralyse(4)
if(grab_ghost_when == CLONER_FRESH_CLONE)
@@ -196,24 +204,19 @@
attempting = FALSE
return TRUE
/obj/machinery/clonepod/proc/wait_complete()
eject_wait = FALSE
//Grow clones to maturity then kick them out. FREELOADERS
/obj/machinery/clonepod/process()
if(!is_operational()) //Autoeject if power is lost
if (occupant)
locked = FALSE
go_out()
connected_message("Clone Ejected: Loss of power.")
else if((occupant) && (occupant.loc == src))
if((occupant.stat == DEAD) || (occupant.suiciding) || occupant.hellbound) //Autoeject corpses and suiciding dudes.
connected_message("Clone Rejected: Deceased.")
SPEAK("The cloning of <b>[occupant.real_name]</b> has been \
SPEAK("The cloning of [occupant.real_name] has been \
aborted due to unrecoverable tissue failure.")
locked = FALSE
go_out()
else if(occupant.cloneloss > (100 - heal_level))
@@ -221,37 +224,43 @@
//Slowly get that clone healed and finished.
occupant.adjustCloneLoss(-((speed_coeff/2) * config.damage_multiplier))
var/progress = CLONE_INITIAL_DAMAGE - occupant.getCloneLoss()
// To avoid the default cloner making incomplete clones
progress += (100 - MINIMUM_HEAL_LEVEL)
var/milestone = CLONE_INITIAL_DAMAGE / flesh_number
var/installed = flesh_number - unattached_flesh.len
if((progress / milestone) >= installed)
// attach some flesh
var/obj/item/I = pick_n_take(unattached_flesh)
if(isorgan(I))
var/obj/item/organ/O = I
O.Insert(occupant)
else if(isbodypart(I))
var/obj/item/bodypart/BP = I
BP.attach_limb(occupant)
//Premature clones may have brain damage.
occupant.adjustBrainLoss(-((speed_coeff/2) * config.damage_multiplier))
//So clones don't die of oxyloss in a running pod.
if (occupant.reagents.get_reagent_amount("salbutamol") < 30)
occupant.reagents.add_reagent("salbutamol", 60)
// NOBREATH species will take brute damage in crit instead
// so heal that as well
if(occupant.reagents.get_reagent_amount("bicaridine") < 5)
occupant.reagents.add_reagent("bicaridine", 10)
check_brine()
use_power(7500) //This might need tweaking.
else if((occupant.cloneloss <= (100 - heal_level)) && (!eject_wait))
else if((occupant.cloneloss <= (100 - heal_level)))
connected_message("Cloning Process Complete.")
SPEAK("The cloning cycle of <b>[occupant]</b> is complete.")
locked = FALSE
SPEAK("The cloning cycle of [occupant.real_name] is complete.")
go_out()
else if ((!occupant) || (occupant.loc != src))
occupant = null
if (locked)
locked = FALSE
if (!mess && !panel_open)
icon_state = "pod_0"
use_power(200)
//Let's unlock this early I guess. Might be too early, needs tweaking.
/obj/machinery/clonepod/attackby(obj/item/weapon/W, mob/user, params)
if(!(occupant || mess || locked))
if(!(occupant || mess))
if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]",W))
return
@@ -263,9 +272,9 @@
if(istype(W,/obj/item/device/multitool))
var/obj/item/device/multitool/P = W
if(istype(P.buffer, /obj/machinery/computer/cloning))
if(get_area_master(P.buffer) != get_area_master(src))
if(get_area(P.buffer) != get_area(src))
user << "<font color = #666633>-% Cannot link machines across power zones. Buffer cleared %-</font color>"
P.buffer = null
return
@@ -278,28 +287,27 @@
P.buffer = src
user << "<font color = #666633>-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-</font color>"
return
if (W.GetID())
if (!check_access(W))
if(W.GetID())
if(!check_access(W))
user << "<span class='danger'>Access Denied.</span>"
return
if (!locked || !occupant)
return
if (occupant.health < -20 && occupant.stat != DEAD)
user << "<span class='danger'>Access Refused. Patient status still unstable.</span>"
if(!(occupant || mess))
user << "<span class='danger'>Error: Pod has no occupant.</span>"
return
else
locked = FALSE
user << "System unlocked."
connected_message("Authorized Ejection")
SPEAK("An authorized ejection of [occupant.real_name] has occurred.")
user << "<span class='notice'>You force an emergency ejection. </span>"
go_out()
else
return ..()
/obj/machinery/clonepod/emag_act(mob/user)
if (isnull(occupant))
if(!occupant)
return
user << "<span class='notice'>You force an emergency ejection.</span>"
locked = FALSE
go_out()
user << "<span class='warning'>You corrupt the genetic compiler.</span>"
malfunction()
//Put messages in the connected computer's temp var for display.
/obj/machinery/clonepod/proc/connected_message(message)
@@ -312,31 +320,17 @@
connected.updateUsrDialog()
return TRUE
/obj/machinery/clonepod/verb/eject()
set name = "Eject Cloner"
set category = "Object"
set src in oview(1)
if(!usr)
return
if(usr.stat || !usr.canmove || usr.restrained())
return
go_out()
add_fingerprint(usr)
/obj/machinery/clonepod/proc/go_out()
if (locked)
return
countdown.stop()
if (mess) //Clean that mess and dump those gibs!
if(mess) //Clean that mess and dump those gibs!
mess = FALSE
new /obj/effect/gibspawner/generic(loc)
audible_message("<span class='italics'>You hear a splat.</span>")
icon_state = "pod_0"
return
if (!occupant)
if(!occupant)
return
if(grab_ghost_when == CLONER_MATURE_CLONE)
@@ -349,7 +343,6 @@
var/turf/T = get_turf(src)
occupant.forceMove(T)
icon_state = "pod_0"
eject_wait = FALSE //If it's still set somehow.
occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest.
occupant = null
@@ -383,14 +376,12 @@
/obj/machinery/clonepod/ex_act(severity, target)
..()
if(!QDELETED(src))
locked = FALSE
go_out()
/obj/machinery/clonepod/handle_atom_del(atom/A)
if(A == occupant)
occupant = null
locked = FALSE
go_out()
countdown.stop()
/obj/machinery/clonepod/proc/horrifyingsound()
for(var/i in 1 to 5)
@@ -401,23 +392,44 @@
/obj/machinery/clonepod/deconstruct(disassembled = TRUE)
if(occupant)
locked = FALSE
go_out()
..()
/obj/machinery/clonepod/proc/maim_clone(mob/living/carbon/human/H)
if(!unattached_flesh)
unattached_flesh = list()
else
for(var/fl in unattached_flesh)
qdel(fl)
unattached_flesh.Cut()
/*
* Diskette Box
*/
H.setCloneLoss(CLONE_INITIAL_DAMAGE) //Yeah, clones start with very low health, not with random, because why would they start with random health
H.setBrainLoss(CLONE_INITIAL_DAMAGE)
// In addition to being cellularly damaged and having barely any
// brain function, they also have no limbs or internal organs.
var/static/list/zones = list("r_arm", "l_arm", "r_leg", "l_leg")
for(var/zone in zones)
var/obj/item/bodypart/BP = H.get_bodypart(zone)
BP.drop_limb()
BP.forceMove(src)
unattached_flesh += BP
/obj/item/weapon/storage/box/disks
name = "diskette box"
icon_state = "disk_kit"
for(var/o in H.internal_organs)
var/obj/item/organ/organ = o
if(!istype(organ) || organ.vital)
continue
organ.Remove(H, special=TRUE)
organ.forceMove(src)
unattached_flesh += organ
/obj/item/weapon/storage/box/disks/New()
..()
for(var/i in 1 to 7)
new /obj/item/weapon/disk/data(src)
flesh_number = unattached_flesh.len
/obj/machinery/clonepod/proc/check_brine()
// Clones are in a pickled bath of mild chemicals, keeping
// them alive, despite their lack of internal organs
for(var/bt in brine_types)
if(occupant.reagents.get_reagent_amount(bt) < 1)
occupant.reagents.add_reagent(bt, 1)
/*
* Manual -- A big ol' manual.
@@ -449,3 +461,4 @@
#undef CLONE_INITIAL_DAMAGE
#undef SPEAK
#undef MINIMUM_HEAL_LEVEL
@@ -416,6 +416,9 @@
/obj/item/weapon/circuitboard/computer/white_ship
name = "White Ship (Computer Board)"
build_path = /obj/machinery/computer/shuttle/white_ship
/obj/item/weapon/circuitboard/computer/auxillary_base
name = "Auxillary Base Management Console (Computer Board)"
build_path = /obj/machinery/computer/auxillary_base
/obj/item/weapon/circuitboard/computer/holodeck// Not going to let people get this, but it's just here for future
name = "Holodeck Control (Computer Board)"
build_path = /obj/machinery/computer/holodeck
+1 -1
View File
@@ -127,7 +127,7 @@
var/obj/item/device/multitool/P = W
if(istype(P.buffer, /obj/machinery/clonepod))
if(get_area_master(P.buffer) != get_area_master(src))
if(get_area(P.buffer) != get_area(src))
user << "<font color = #666633>-% Cannot link machines across power zones. Buffer cleared %-</font color>"
P.buffer = null
return
@@ -64,11 +64,12 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0)
if("login")
var/mob/M = usr
var/obj/item/weapon/card/id/I = M.get_active_held_item()
if (istype(I, /obj/item/device/pda))
var/obj/item/device/pda/pda = I
I = pda.id
if (I && istype(I))
if(!istype(I))
I = M.get_idcard()
if(I && istype(I))
if(src.check_access(I))
authenticated = 1
auth_id = "[I.registered_name] ([I.assignment])"
@@ -148,7 +149,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
if("buyshuttle")
if(authenticated==2)
var/list/shuttles = flatten_list(shuttle_templates)
var/list/shuttles = flatten_list(SSmapping.shuttle_templates)
var/datum/map_template/shuttle/S = locate(href_list["chosen_shuttle"]) in shuttles
if(S && istype(S))
if(SSshuttle.emergency.mode != SHUTTLE_RECALL && SSshuttle.emergency.mode != SHUTTLE_IDLE)
@@ -521,8 +522,8 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
if(STATE_PURCHASE)
dat += "Budget: [SSshuttle.points] Credits.<BR>"
for(var/shuttle_id in shuttle_templates)
var/datum/map_template/shuttle/S = shuttle_templates[shuttle_id]
for(var/shuttle_id in SSmapping.shuttle_templates)
var/datum/map_template/shuttle/S = SSmapping.shuttle_templates[shuttle_id]
if(S.can_be_bought && S.credit_cost < INFINITY)
dat += "[S.name] | [S.credit_cost] Credits<BR>"
dat += "[S.description]<BR>"
+1 -1
View File
@@ -762,7 +762,7 @@ What a mess.*/
if(4)
R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Discharged")
if(5)
R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
R.fields["p_stat"] = pick("*Unconscious*", "Active", "Physically Unfit")
if(6)
R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
if(7)
+8 -37
View File
@@ -81,14 +81,6 @@ var/list/airlock_overlays = list()
var/airlock_material = null //material of inner filling; if its an airlock with glass, this should be set to "glass"
var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
var/image/old_frame_overlay //keep those in order to prevent unnecessary updating
var/image/old_filling_overlay
var/image/old_lights_overlay
var/image/old_panel_overlay
var/image/old_weld_overlay
var/image/old_sparks_overlay
var/image/old_dam_overlay
var/cyclelinkeddir = 0
var/obj/machinery/door/airlock/cyclelinkedairlock
var/shuttledocked = 0
@@ -452,35 +444,14 @@ var/list/airlock_overlays = list()
else
panel_overlay = get_airlock_overlay("panel_opening", overlays_file)
//doesn't use cut_overlays() for performance reasons
if(frame_overlay != old_frame_overlay)
overlays -= old_frame_overlay
add_overlay(frame_overlay)
old_frame_overlay = frame_overlay
if(filling_overlay != old_filling_overlay)
overlays -= old_filling_overlay
add_overlay(filling_overlay)
old_filling_overlay = filling_overlay
if(lights_overlay != old_lights_overlay)
overlays -= old_lights_overlay
add_overlay(lights_overlay)
old_lights_overlay = lights_overlay
if(panel_overlay != old_panel_overlay)
overlays -= old_panel_overlay
add_overlay(panel_overlay)
old_panel_overlay = panel_overlay
if(weld_overlay != old_weld_overlay)
overlays -= old_weld_overlay
add_overlay(weld_overlay)
old_weld_overlay = weld_overlay
if(sparks_overlay != old_sparks_overlay)
overlays -= old_sparks_overlay
add_overlay(sparks_overlay)
old_sparks_overlay = sparks_overlay
if(damag_overlay != old_dam_overlay)
overlays -= old_dam_overlay
add_overlay(damag_overlay)
old_dam_overlay = damag_overlay
cut_overlays()
add_overlay(frame_overlay)
add_overlay(filling_overlay)
add_overlay(lights_overlay)
add_overlay(panel_overlay)
add_overlay(weld_overlay)
add_overlay(sparks_overlay)
add_overlay(damag_overlay)
/proc/get_airlock_overlay(icon_state, icon_file)
var/iconkey = "[icon_state][icon_file]"
+10 -31
View File
@@ -426,7 +426,7 @@
use_power = FALSE
resistance_flags = FIRE_PROOF | ACID_PROOF
damage_deflection = 30
normal_integrity = 400
normal_integrity = 240
var/construction_state = GEAR_SECURE //Pinion airlocks have custom deconstruction
/obj/machinery/door/airlock/clockwork/New()
@@ -445,13 +445,15 @@
var/gear_text = "The cogwheel is flickering and twisting wildly. Report this to a coder."
switch(construction_state)
if(GEAR_SECURE)
gear_text = "<span class='brass'>The cogwheel is solidly <b>screwed</b> to the brass around it.</span>"
if(GEAR_UNFASTENED)
gear_text = "<span class='brass'>The cogwheel is <i>unscrewed</i>, but is still <b>wrenched</b> to the brass.</span>"
gear_text = "<span class='brass'>The cogwheel is solidly <b>wrenched</b> to the brass around it.</span>"
if(GEAR_LOOSE)
gear_text = "<span class='alloy'>The cogwheel has been <i>loosened</i>, but remains <b>connected loosely</b> to the door!</span>"
user << gear_text
/obj/machinery/door/airlock/clockwork/emp_act(severity)
if(prob(80/severity))
open()
/obj/machinery/door/airlock/clockwork/canAIControl(mob/user)
return (is_servant_of_ratvar(user) && !isAllPowerCut())
@@ -495,34 +497,11 @@
/obj/machinery/door/airlock/clockwork/proc/attempt_construction(obj/item/I, mob/living/user)
if(!I || !user || !user.canUseTopic(src))
return 0
if(istype(I, /obj/item/weapon/screwdriver))
if(construction_state == GEAR_SECURE)
user.visible_message("<span class='notice'>[user] begins unfastening [src]'s cogwheel...</span>", "<span class='notice'>You begin unfastening [src]'s cogwheel...</span>")
playsound(src, I.usesound, 50, 1)
if(!do_after(user, 100*I.toolspeed, target = src) || construction_state != GEAR_SECURE)
return 1 //Returns 1 so as not to have extra interactions with the tools used (i.e. prying open)
user.visible_message("<span class='notice'>[user] unfastens [src]'s cogwheel!</span>", "<span class='notice'>[src]'s cogwheel shifts slightly with a pop.</span>")
playsound(src, 'sound/items/Screwdriver2.ogg', 50, 1)
construction_state = GEAR_UNFASTENED
else if(construction_state == GEAR_UNFASTENED)
user.visible_message("<span class='notice'>[user] begins fastening [src]'s cogwheel...</span>", "<span class='notice'>You begin fastening [src]'s cogwheel...</span>")
playsound(src, I.usesound, 50, 1)
if(!do_after(user, 75*I.toolspeed, target = src) || construction_state != GEAR_UNFASTENED)
return 1
user.visible_message("<span class='notice'>[user] fastens [src]'s cogwheel!</span>", "<span class='notice'>[src]'s cogwheel shifts back into place.</span>")
playsound(src, 'sound/items/Screwdriver2.ogg', 50, 1)
construction_state = GEAR_SECURE
else if(construction_state == GEAR_LOOSE)
user << "<span class='warning'>The gear isn't secure enough to fasten!</span>"
return 1
else if(istype(I, /obj/item/weapon/wrench))
if(construction_state == GEAR_SECURE)
user << "<span class='warning'>[src]'s cogwheel is too tightly secured! Your [I.name] can't get a solid grip!</span>"
return 0
else if(construction_state == GEAR_UNFASTENED)
user.visible_message("<span class='notice'>[user] begins loosening [src]'s cogwheel...</span>", "<span class='notice'>You begin loosening [src]'s cogwheel...</span>")
playsound(src, I.usesound, 50, 1)
if(!do_after(user, 100*I.toolspeed, target = src) || construction_state != GEAR_UNFASTENED)
if(!do_after(user, 75*I.toolspeed, target = src) || construction_state != GEAR_SECURE)
return 1
user.visible_message("<span class='notice'>[user] loosens [src]'s cogwheel!</span>", "<span class='notice'>[src]'s cogwheel pops off and dangles loosely.</span>")
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
@@ -534,16 +513,16 @@
return 1
user.visible_message("<span class='notice'>[user] tightens [src]'s cogwheel!</span>", "<span class='notice'>You firmly tighten [src]'s cogwheel into place.</span>")
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
construction_state = GEAR_UNFASTENED
construction_state = GEAR_SECURE
return 1
else if(istype(I, /obj/item/weapon/crowbar))
if(construction_state == GEAR_SECURE || construction_state == GEAR_UNFASTENED)
if(construction_state == GEAR_SECURE)
user << "<span class='warning'>[src]'s cogwheel is too tightly secured! Your [I.name] can't reach under it!</span>"
return 1
else if(construction_state == GEAR_LOOSE)
user.visible_message("<span class='notice'>[user] begins slowly lifting off [src]'s cogwheel...</span>", "<span class='notice'>You slowly begin lifting off [src]'s cogwheel...</span>")
playsound(src, I.usesound, 50, 1)
if(!do_after(user, 100*I.toolspeed, target = src) || construction_state != GEAR_LOOSE)
if(!do_after(user, 75*I.toolspeed, target = src) || construction_state != GEAR_LOOSE)
return 1
user.visible_message("<span class='notice'>[user] lifts off [src]'s cogwheel, causing it to fall apart!</span>", \
"<span class='notice'>You lift off [src]'s cogwheel, causing it to fall apart!</span>")
-3
View File
@@ -36,9 +36,6 @@
var/alert = signal.data["alert"]
var/area/our_area = get_area(src)
if (our_area.master)
our_area = our_area.master
if(alarm_area == our_area.name)
switch(alert)
if("severe")
+4
View File
@@ -339,6 +339,10 @@
change_construction_value(-2)
return ..()
/obj/machinery/door/window/clockwork/emp_act(severity)
if(prob(80/severity))
open()
/obj/machinery/door/window/clockwork/ratvar_act()
if(ratvar_awakens)
obj_integrity = max_integrity
+1 -1
View File
@@ -96,7 +96,7 @@
return
var/area/A = get_area(src)
A.firealert(src)
playsound(src.loc, 'goon/sound/machinery/FireAlarm.ogg', 75, 1)
playsound(src.loc, 'goon/sound/machinery/FireAlarm.ogg', 75)
/obj/machinery/firealarm/proc/alarm_in(time)
addtimer(CALLBACK(src, .proc/alarm), time)
+1 -1
View File
@@ -171,7 +171,7 @@ var/list/holopads = list()
var/area/holo_area = get_area(src)
var/area/eye_area = get_area(master.eyeobj)
if(eye_area in holo_area.master.related)
if(eye_area in holo_area.related)
return TRUE
clear_holo(master)//If not, we want to get rid of the hologram.
+1 -1
View File
@@ -24,7 +24,7 @@
else
icon_state = "donateidle"
overlays = null
cut_overlays()
if(beaker)
if(attached)
+2 -2
View File
@@ -48,7 +48,7 @@
on = !on
for(var/area/A in area.master.related)
for(var/area/A in area.related)
A.lightswitch = on
A.updateicon()
@@ -56,7 +56,7 @@
L.on = on
L.updateicon()
area.master.power_change()
area.power_change()
/obj/machinery/light_switch/power_change()
@@ -571,11 +571,9 @@
/obj/machinery/porta_turret/aux_base
name = "perimeter defense turret"
desc = "A plasma cutter turret calibrated to defend outposts against non-humanoid fauna."
req_access = list() //Can be disabled/enabled by any humanoid!
desc = "A plasma beam turret calibrated to defend outposts against non-humanoid fauna. It is more effective when exposed to the environment."
installation = null
lethal_projectile = /obj/item/projectile/plasma
lethal_projectile = /obj/item/projectile/plasma/turret
lethal_projectile_sound = 'sound/weapons/plasma_cutter.ogg'
mode = TURRET_LETHAL //It would be useless in stun mode anyway
faction = "neutral" //Minebots, medibots, etc that should not be shot.
@@ -586,6 +584,9 @@
/obj/machinery/porta_turret/aux_base/setup()
return
/obj/machinery/porta_turret/aux_base/interact(mob/user) //Controlled solely from the base console.
return
/obj/machinery/porta_turret/aux_base/New()
..()
cover.name = name
@@ -636,11 +637,7 @@
break
if(!control_area)
var/area/CA = get_area(src)
if(CA.master && CA.master != CA)
control_area = CA.master
else
control_area = CA
control_area = get_area(src)
for(var/obj/machinery/porta_turret/T in control_area)
turrets |= T
+4 -3
View File
@@ -66,6 +66,10 @@ var/list/obj/machinery/requests_console/allConsoles = list()
update_icon()
/obj/machinery/requests_console/update_icon()
if(stat & NOPOWER)
SetLuminosity(0)
else
SetLuminosity(2)
if(open)
if(!hackState)
icon_state="req_comp_open"
@@ -188,7 +192,6 @@ var/list/obj/machinery/requests_console/allConsoles = list()
if (Console.department == department)
Console.newmessagepriority = 0
Console.update_icon()
Console.SetLuminosity(1)
newmessagepriority = 0
update_icon()
var/messageComposite = ""
@@ -375,7 +378,6 @@ var/list/obj/machinery/requests_console/allConsoles = list()
alert = "Message from [department][authentic]"
Console.createmessage(src, alert , sending, 1, 1)
screen = 6
Console.SetLuminosity(2)
if(radio_freq)
Radio.talk_into(src,"[alert]: <i>[message]</i>",radio_freq)
@@ -476,7 +478,6 @@ var/list/obj/machinery/requests_console/allConsoles = list()
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1)
say(title)
src.messages += "<b>From:</b> [linkedsender]<BR>[message]"
SetLuminosity(2)
/obj/machinery/requests_console/attackby(obj/item/weapon/O, mob/user, params)
if(istype(O, /obj/item/weapon/crowbar))
+2 -2
View File
@@ -29,7 +29,7 @@
qdel(O)
user << "<span class='notice'>You insert [count] metal sheet\s into \the [src].</span>"
src.overlays -= "fab-load-metal"
cut_overlay("fab-load-metal")
updateDialog()
else
user << "\The [src] is full."
@@ -143,7 +143,7 @@ Please wait until completion...</TT><BR>
src.being_built = null
src.use_power = 1
src.operating = 0
src.overlays -= "fab-active"
cut_overlay("fab-active")
return
updateUsrDialog()
+2 -4
View File
@@ -153,8 +153,7 @@
maptext = new_text
/obj/machinery/status_display/proc/remove_display()
if(overlays.len)
cut_overlays()
cut_overlays()
if(maptext)
maptext = ""
@@ -277,8 +276,7 @@
/obj/machinery/ai_status_display/proc/set_picture(state)
picture_state = state
if(overlays.len)
cut_overlays()
cut_overlays()
add_overlay(image('icons/obj/status_display.dmi', icon_state=picture_state))
#undef CHARS_PER_LINE
+1
View File
@@ -54,6 +54,7 @@
/obj/machinery/suit_storage_unit/hos
suit_type = /obj/item/clothing/suit/space/hardsuit/security/hos
mask_type = /obj/item/clothing/mask/gas/sechailer
storage_type = /obj/item/weapon/tank/internals/oxygen
/obj/machinery/suit_storage_unit/atmos
suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos
+141 -76
View File
@@ -623,6 +623,7 @@
*/
/*
/obj/machinery/vending/[vendors name here] // --vending machine template :)
name = ""
desc = ""
@@ -631,6 +632,7 @@
products = list()
contraband = list()
premium = list()
IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY CANISTER CHARGES in vending_items.dm
*/
@@ -699,6 +701,28 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
refill_canister = /obj/item/weapon/vending_refill/snack
var/chef_compartment_access = "28"
/obj/machinery/vending/snack/random
name = "\improper Random Snackies"
desc = "Uh oh!"
/obj/machinery/vending/snack/random/New()
..()
var/T = pick(subtypesof(/obj/machinery/vending/snack) - /obj/machinery/vending/snack/random)
new T(get_turf(src))
qdel(src)
/obj/machinery/vending/snack/blue
icon_state = "snackblue"
/obj/machinery/vending/snack/orange
icon_state = "snackorange"
/obj/machinery/vending/snack/green
icon_state = "snackgreen"
/obj/machinery/vending/snack/teal
icon_state = "snackteal"
/obj/machinery/vending/sustenance
name = "\improper Sustenance Vendor"
desc = "A vending machine which vends food, as required by section 47-C of the NT's Prisoner Ethical Treatment Agreement."
@@ -723,12 +747,67 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
product_ads = "Refreshing!;Hope you're thirsty!;Over 1 million drinks sold!;Thirsty? Why not cola?;Please, have a drink!;Drink up!;The best drinks in space."
products = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 10,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/starkist = 10,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_up = 10,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_up = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime = 10)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/thirteenloko = 6)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/thirteenloko = 6,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/shamblers = 6)
premium = list(/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola = 1)
refill_canister = /obj/item/weapon/vending_refill/cola
/obj/machinery/vending/cola/random
name = "\improper Random Drinkies"
desc = "Uh oh!"
/obj/machinery/vending/cola/random/New()
..()
var/T = pick(subtypesof(/obj/machinery/vending/cola) - /obj/machinery/vending/cola/random)
new T(get_turf(src))
qdel(src)
/obj/machinery/vending/cola/blue
icon_state = "Cola_Machine"
/obj/machinery/vending/cola/black
icon_state = "cola_black"
/obj/machinery/vending/cola/red
icon_state = "red_cola"
name = "\improper Space Cola Vendor"
desc = "It vends cola, in space."
product_slogans = "Cola in space!"
/obj/machinery/vending/cola/space_up
icon_state = "space_up"
name = "\improper Space-up! Vendor"
desc = "Indulge in an explosion of flavor."
product_slogans = "Space-up! Like a hull breach in your mouth."
/obj/machinery/vending/cola/starkist
icon_state = "starkist"
name = "\improper Star-kist Vendor"
desc = "The taste of a star in liquid form."
product_slogans = "Drink the stars! Star-kist!"
/obj/machinery/vending/cola/sodie
icon_state = "soda"
/obj/machinery/vending/cola/pwr_game
icon_state = "pwr_game"
name = "\improper Pwr Game Vendor"
desc = "You want it, we got it. Brought to you in partnership with Vlad's Salads."
product_slogans = "The POWER that gamers crave! PWR GAME!"
/obj/machinery/vending/cola/shamblers
name = "\improper Shambler's Vendor"
desc = "~Shake me up some of that Shambler's Juice!~"
icon_state = "shamblers_juice"
products = list(/obj/item/weapon/reagent_containers/food/drinks/soda_cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_mountain_wind = 10,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/starkist = 10,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/space_up = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/pwr_game = 10,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime = 10,/obj/item/weapon/reagent_containers/food/drinks/soda_cans/shamblers = 10)
product_slogans = "~Shake me up some of that Shambler's Juice!~"
product_ads = "Refreshing!;Jyrbv dv lg jfdv fw kyrk Jyrdscvi'j Alztv!;Over 1 trillion souls drank!;Thirsty? Nyp efk uizeb kyv uribevjj?;Kyv Jyrdscvi uizebj kyv ezxyk!;Drink up!;Krjkp."
//This one's from bay12
/obj/machinery/vending/cart
name = "\improper PTech"
@@ -910,65 +989,39 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/clothing/suit/hooded/carp_costume = 1,
/obj/item/clothing/suit/hooded/ian_costume = 1,
/obj/item/clothing/suit/hooded/bee_costume = 1,
/obj/item/clothing/suit/snowman = 1,
/obj/item/clothing/head/snowman = 1,
/obj/item/clothing/suit/snowman = 1,/obj/item/clothing/head/snowman = 1,
/obj/item/clothing/mask/joy = 1,
/obj/item/clothing/head/cueball = 1,
/obj/item/clothing/under/scratch = 1,
/obj/item/clothing/under/sailor=1,
/obj/item/clothing/shoes/megaboots=1,
/obj/item/clothing/gloves/megagloves=1,
/obj/item/clothing/head/helmet/megahelmet=1,
/obj/item/clothing/under/mega=1,
/obj/item/clothing/shoes/protoboots=1,
/obj/item/clothing/gloves/protogloves=1,
/obj/item/clothing/head/helmet/protohelmet = 1,
/obj/item/clothing/under/proto = 1,
/obj/item/clothing/shoes/megaxboots = 1,
/obj/item/clothing/gloves/megaxgloves = 1,
/obj/item/clothing/head/helmet/megaxhelmet = 1,
/obj/item/clothing/under/megax = 1,
/obj/item/clothing/shoes/joeboots = 1,
/obj/item/clothing/gloves/joegloves = 1,
/obj/item/clothing/head/helmet/joehelmet = 1,
/obj/item/clothing/under/joe = 1,
/obj/item/clothing/shoes/megaboots=1,/obj/item/clothing/gloves/megagloves=1,/obj/item/clothing/head/helmet/megahelmet=1,/obj/item/clothing/under/mega=1,
/obj/item/clothing/shoes/protoboots=1,/obj/item/clothing/gloves/protogloves=1,/obj/item/clothing/head/helmet/protohelmet = 1,/obj/item/clothing/under/proto = 1,
/obj/item/clothing/shoes/megaxboots = 1,/obj/item/clothing/gloves/megaxgloves = 1,/obj/item/clothing/head/helmet/megaxhelmet = 1,/obj/item/clothing/under/megax = 1,
/obj/item/clothing/shoes/joeboots = 1,/obj/item/clothing/gloves/joegloves = 1,/obj/item/clothing/head/helmet/joehelmet = 1,/obj/item/clothing/under/joe = 1,
/obj/item/clothing/under/vault = 1,
/obj/item/clothing/under/roll = 1,
/obj/item/clothing/head/clownpiece = 1,
/obj/item/clothing/under/clownpiece = 1,
/obj/item/clothing/suit/clownpiece = 1
/obj/item/clothing/head/clownpiece = 1,/obj/item/clothing/under/clownpiece = 1,/obj/item/clothing/suit/clownpiece = 1
)
contraband = list(/obj/item/clothing/suit/judgerobe = 1,
/obj/item/clothing/head/powdered_wig = 1,
contraband = list(/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,
/obj/item/weapon/gun/magic/wand = 2,
/obj/item/clothing/glasses/sunglasses/garb = 2,
/obj/item/clothing/gloves/anchor_arms = 1,
/obj/item/clothing/suit/kaminacape = 1,
/obj/item/clothing/under/soldieruniform = 1,
/obj/item/clothing/head/stalhelm = 1,
/obj/item/clothing/suit/soldiercoat = 1,
/obj/item/clothing/under/soldieruniform = 1,/obj/item/clothing/head/stalhelm = 1,/obj/item/clothing/suit/soldiercoat = 1,
/obj/item/clothing/under/officeruniform = 1,
/obj/item/clothing/head/naziofficer = 1,
/obj/item/clothing/suit/officercoat = 1,
/obj/item/clothing/head/panzer = 1,
/obj/item/clothing/under/russobluecamooutfit = 1,
/obj/item/clothing/head/russobluecamohat = 1,
/obj/item/clothing/suit/russofurcoat = 1,
/obj/item/clothing/head/russofurhat = 1,
/obj/item/clothing/under/rottensuit = 1,
/obj/item/clothing/shoes/rottenshoes = 1,
/obj/item/clothing/head/helmet/biker = 1,
/obj/item/clothing/under/bikersuit = 1,
/obj/item/clothing/gloves/bikergloves = 1,
/obj/item/clothing/under/russobluecamooutfit = 1,/obj/item/clothing/head/russobluecamohat = 1,
/obj/item/clothing/suit/russofurcoat = 1,/obj/item/clothing/head/russofurhat = 1,
/obj/item/clothing/under/rottensuit = 1,/obj/item/clothing/shoes/rottenshoes = 1,
/obj/item/clothing/head/helmet/biker = 1,/obj/item/clothing/under/bikersuit = 1,/obj/item/clothing/gloves/bikergloves = 1,
/obj/item/clothing/under/jacketsuit = 1,
/obj/item/clothing/head/helmet/richard = 1,
/obj/item/clothing/under/vault13 = 1
)
premium = list(/obj/item/clothing/suit/pirate/captain = 2,
/obj/item/clothing/head/pirate/captain = 2,
/obj/item/clothing/head/helmet/roman = 1,
/obj/item/clothing/head/helmet/roman/legionaire = 1,
/obj/item/clothing/under/roman = 1,
premium = list(/obj/item/clothing/suit/pirate/captain = 2,/obj/item/clothing/head/pirate/captain = 2,
/obj/item/clothing/head/helmet/roman = 1,/obj/item/clothing/head/helmet/roman/legionaire = 1,/obj/item/clothing/under/roman = 1,
/obj/item/clothing/shoes/roman = 1,
/obj/item/weapon/shield/riot/roman = 1,
/obj/item/weapon/skub = 1
@@ -1058,36 +1111,38 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
product_slogans = "Dress for success!;Prepare to look swagalicious!;Look at all this free swag!;Why leave style up to fate? Use the ClothesMate!"
vend_reply = "Thank you for using the ClothesMate!"
products = list(/obj/item/clothing/head/that=2,/obj/item/clothing/head/fedora=1,/obj/item/clothing/glasses/monocle=1,
/obj/item/clothing/suit/jacket=2, /obj/item/clothing/suit/jacket/puffer/vest=2, /obj/item/clothing/suit/jacket/puffer=2,
/obj/item/clothing/under/suit_jacket/navy=1,/obj/item/clothing/under/suit_jacket/really_black=1,/obj/item/clothing/under/suit_jacket/burgundy=1,
/obj/item/clothing/under/suit_jacket/charcoal=1, /obj/item/clothing/under/suit_jacket/white=1,/obj/item/clothing/under/kilt=1,/obj/item/clothing/under/overalls=1,
/obj/item/clothing/under/sl_suit=1,/obj/item/clothing/under/pants/jeans=3,/obj/item/clothing/under/pants/classicjeans=2,
/obj/item/clothing/under/pants/camo = 1,/obj/item/clothing/under/pants/blackjeans=2,/obj/item/clothing/under/pants/khaki=2,
/obj/item/clothing/under/pants/white=2,/obj/item/clothing/under/pants/red=1,/obj/item/clothing/under/pants/black=2,
/obj/item/clothing/under/pants/tan=2,/obj/item/clothing/under/pants/track=1,/obj/item/clothing/suit/jacket/miljacket = 1,
/obj/item/clothing/neck/tie/blue=1, /obj/item/clothing/neck/tie/red=1, /obj/item/clothing/neck/tie/black=1, /obj/item/clothing/neck/tie/horrible=1,
/obj/item/clothing/neck/scarf/red=1,/obj/item/clothing/neck/scarf/green=1,/obj/item/clothing/neck/scarf/darkblue=1,
/obj/item/clothing/neck/scarf/purple=1,/obj/item/clothing/neck/scarf/yellow=1,/obj/item/clothing/neck/scarf/orange=1,
/obj/item/clothing/neck/scarf/cyan=1,/obj/item/clothing/neck/scarf=1,/obj/item/clothing/neck/scarf/black=1,
/obj/item/clothing/neck/scarf/zebra=1,/obj/item/clothing/neck/scarf/christmas=1,/obj/item/clothing/neck/stripedredscarf=1,
/obj/item/clothing/neck/stripedbluescarf=1,/obj/item/clothing/neck/stripedgreenscarf=1,/obj/item/clothing/tie/waistcoat=1,
/obj/item/clothing/under/skirt/black=1,/obj/item/clothing/under/skirt/blue=1,/obj/item/clothing/under/skirt/red=1,/obj/item/clothing/under/skirt/purple=1,
/obj/item/clothing/under/sundress=2,/obj/item/clothing/under/stripeddress=1, /obj/item/clothing/under/sailordress=1, /obj/item/clothing/under/redeveninggown=1, /obj/item/clothing/under/blacktango=1,
/obj/item/clothing/under/plaid_skirt=1,/obj/item/clothing/under/plaid_skirt/blue=1,/obj/item/clothing/under/plaid_skirt/purple=1,/obj/item/clothing/under/plaid_skirt/green=1,
/obj/item/clothing/glasses/regular=2,/obj/item/clothing/head/sombrero=1,/obj/item/clothing/suit/poncho=1,
/obj/item/clothing/suit/ianshirt=1,/obj/item/clothing/shoes/laceup=2,/obj/item/clothing/shoes/sneakers/black=4,
/obj/item/clothing/shoes/sandal=1, /obj/item/clothing/gloves/fingerless=2,/obj/item/clothing/glasses/orange=1,/obj/item/clothing/glasses/red=1,
/obj/item/weapon/storage/belt/fannypack=1, /obj/item/weapon/storage/belt/fannypack/blue=1, /obj/item/weapon/storage/belt/fannypack/red=1, /obj/item/clothing/suit/jacket/letterman=2,
/obj/item/clothing/head/beanie=1, /obj/item/clothing/head/beanie/black=1, /obj/item/clothing/head/beanie/red=1, /obj/item/clothing/head/beanie/green=1, /obj/item/clothing/head/beanie/darkblue=1,
/obj/item/clothing/head/beanie/purple=1, /obj/item/clothing/head/beanie/yellow=1, /obj/item/clothing/head/beanie/orange=1, /obj/item/clothing/head/beanie/cyan=1, /obj/item/clothing/head/beanie/christmas=1,
/obj/item/clothing/head/beanie/striped=1, /obj/item/clothing/head/beanie/stripedred=1, /obj/item/clothing/head/beanie/stripedblue=1, /obj/item/clothing/head/beanie/stripedgreen=1,
/obj/item/clothing/suit/jacket/letterman_red=1, /obj/item/clothing/under/wintercasualwear=1, /obj/item/clothing/under/casualwear=1, /obj/item/clothing/under/casualhoodie=1,
/obj/item/clothing/under/casualhoodie/skirt=1,
/obj/item/clothing/under/bb_sweater=2,
/obj/item/clothing/under/bb_sweater/blue=2,
/obj/item/clothing/under/bb_sweater/green=2,
/obj/item/clothing/under/bb_sweater/purple =2,
/obj/item/clothing/under/bb_sweater/red=2)
/obj/item/clothing/suit/jacket=2, /obj/item/clothing/suit/jacket/puffer/vest=2, /obj/item/clothing/suit/jacket/puffer=2,
/obj/item/clothing/under/suit_jacket/navy=1,/obj/item/clothing/under/suit_jacket/really_black=1,/obj/item/clothing/under/suit_jacket/burgundy=1,
/obj/item/clothing/under/suit_jacket/charcoal=1, /obj/item/clothing/under/suit_jacket/white=1,/obj/item/clothing/under/kilt=1,/obj/item/clothing/under/overalls=1,
/obj/item/clothing/under/sl_suit=1,/obj/item/clothing/under/pants/jeans=3,/obj/item/clothing/under/pants/classicjeans=2,
/obj/item/clothing/under/pants/camo = 1,/obj/item/clothing/under/pants/blackjeans=2,/obj/item/clothing/under/pants/khaki=2,
/obj/item/clothing/under/pants/white=2,/obj/item/clothing/under/pants/red=1,/obj/item/clothing/under/pants/black=2,
/obj/item/clothing/under/pants/tan=2,/obj/item/clothing/under/pants/track=1,/obj/item/clothing/suit/jacket/miljacket = 1,
/obj/item/clothing/neck/tie/blue=1, /obj/item/clothing/neck/tie/red=1, /obj/item/clothing/neck/tie/black=1, /obj/item/clothing/neck/tie/horrible=1,
/obj/item/clothing/neck/scarf/red=1,/obj/item/clothing/neck/scarf/green=1,/obj/item/clothing/neck/scarf/darkblue=1,
/obj/item/clothing/neck/scarf/purple=1,/obj/item/clothing/neck/scarf/yellow=1,/obj/item/clothing/neck/scarf/orange=1,
/obj/item/clothing/neck/scarf/cyan=1,/obj/item/clothing/neck/scarf=1,/obj/item/clothing/neck/scarf/black=1,
/obj/item/clothing/neck/scarf/zebra=1,/obj/item/clothing/neck/scarf/christmas=1,/obj/item/clothing/neck/stripedredscarf=1,
/obj/item/clothing/neck/stripedbluescarf=1,/obj/item/clothing/neck/stripedgreenscarf=1,/obj/item/clothing/tie/waistcoat=1,
/obj/item/clothing/under/skirt/black=1,/obj/item/clothing/under/skirt/blue=1,/obj/item/clothing/under/skirt/red=1,/obj/item/clothing/under/skirt/purple=1,
/obj/item/clothing/under/sundress=2,/obj/item/clothing/under/stripeddress=1, /obj/item/clothing/under/sailordress=1, /obj/item/clothing/under/redeveninggown=1, /obj/item/clothing/under/blacktango=1,
/obj/item/clothing/under/plaid_skirt=1,/obj/item/clothing/under/plaid_skirt/blue=1,/obj/item/clothing/under/plaid_skirt/purple=1,/obj/item/clothing/under/plaid_skirt/green=1,
/obj/item/clothing/glasses/regular=2,/obj/item/clothing/head/sombrero=1,/obj/item/clothing/suit/poncho=1,
/obj/item/clothing/suit/ianshirt=1,/obj/item/clothing/shoes/laceup=2,/obj/item/clothing/shoes/sneakers/black=4,
/obj/item/clothing/shoes/sandal=1, /obj/item/clothing/gloves/fingerless=2,/obj/item/clothing/glasses/orange=1,/obj/item/clothing/glasses/red=1,
/obj/item/weapon/storage/belt/fannypack=1, /obj/item/weapon/storage/belt/fannypack/blue=1, /obj/item/weapon/storage/belt/fannypack/red=1, /obj/item/clothing/suit/jacket/letterman=2,
/obj/item/clothing/head/beanie=1, /obj/item/clothing/head/beanie/black=1, /obj/item/clothing/head/beanie/red=1, /obj/item/clothing/head/beanie/green=1, /obj/item/clothing/head/beanie/darkblue=1,
/obj/item/clothing/head/beanie/purple=1, /obj/item/clothing/head/beanie/yellow=1, /obj/item/clothing/head/beanie/orange=1, /obj/item/clothing/head/beanie/cyan=1, /obj/item/clothing/head/beanie/christmas=1,
/obj/item/clothing/head/beanie/striped=1, /obj/item/clothing/head/beanie/stripedred=1, /obj/item/clothing/head/beanie/stripedblue=1, /obj/item/clothing/head/beanie/stripedgreen=1,
/obj/item/clothing/suit/jacket/letterman_red=1,
/obj/item/clothing/under/wintercasualwear=1, /obj/item/clothing/under/casualwear=1, /obj/item/clothing/under/casualhoodie=1,
/obj/item/clothing/under/casualhoodie/skirt=1,
/obj/item/clothing/under/bb_sweater=2,
/obj/item/clothing/under/bb_sweater/blue=2,
/obj/item/clothing/under/bb_sweater/green=2,
/obj/item/clothing/under/bb_sweater/purple =2,
/obj/item/clothing/under/bb_sweater/red=2
)
contraband = list(/obj/item/clothing/under/syndicate/tacticool=1,/obj/item/clothing/mask/balaclava=1,/obj/item/clothing/head/ushanka=1,/obj/item/clothing/under/soviet=1,/obj/item/weapon/storage/belt/fannypack/black=2,/obj/item/clothing/suit/jacket/letterman_syndie=1,/obj/item/clothing/under/jabroni=1, /obj/item/clothing/suit/vapeshirt=1, /obj/item/clothing/under/geisha=1,
/obj/item/clothing/under/wedding/bride_orange=1,
/obj/item/clothing/under/wedding/bride_purple=1,
@@ -1097,7 +1152,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/item/clothing/under/keyholesweater=1,
/obj/item/clothing/suit/doshjacket=1,
/obj/item/clothing/under/squatter_outfit = 1,
/obj/item/clothing/head/squatter_hat = 1)
/obj/item/clothing/head/squatter_hat = 1
)
premium = list(/obj/item/clothing/under/suit_jacket/checkered=1,/obj/item/clothing/head/mailman=1,/obj/item/clothing/under/rank/mailman=1,/obj/item/clothing/suit/jacket/leather=1,/obj/item/clothing/suit/jacket/leather/overcoat=1,/obj/item/clothing/under/pants/mustangjeans=1,/obj/item/clothing/neck/necklace/dope=3,/obj/item/clothing/suit/jacket/letterman_nanotrasen=1)
refill_canister = /obj/item/weapon/vending_refill/clothing
@@ -1105,17 +1161,26 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/kink
name = "KinkMate"
desc = "A vending machine for all your unmentionable desires."
icon = 'icons/obj/citvending.dmi'
icon_state = "kink"
product_slogans = "Kinky!;Sexy!;Check me out, big boy!"
vend_reply = "Have fun, you shameless pervert!"
products = list(/obj/item/clothing/under/maid = 5, /obj/item/clothing/under/stripper_pink = 5, /obj/item/clothing/under/stripper_green = 5)
contraband = list(/obj/item/weapon/restraints/handcuffs/fake/kinky = 5, /obj/item/clothing/neck/petcollar=5, /obj/item/clothing/under/mankini = 1)
products = list(
/obj/item/clothing/under/maid = 5,
/obj/item/clothing/under/stripper_pink = 5,
/obj/item/clothing/under/stripper_green = 5
)
contraband = list(/obj/item/weapon/restraints/handcuffs/fake/kinky = 5,
/obj/item/clothing/neck/petcollar=5,
/obj/item/clothing/under/mankini = 1
)
premium = list()
refill_canister = /obj/item/weapon/vending_refill/kink
/obj/machinery/vending/nazivend
name = "Nazivend"
desc = "A vending machine containing Nazi German supplies. A label reads: \"Remember the gorrilions lost.\""
icon = 'icons/obj/citvending.dmi'
icon_state = "nazi"
vend_reply = "SIEG HEIL!"
product_slogans = "Das Vierte Reich wird zuruckkehren!;ENTFERNEN JUDEN!;Billiger als die Juden jemals geben!;Rader auf dem adminbus geht rund und rund.;Warten Sie, warum wir wieder hassen Juden?- *BZZT*"
@@ -1140,6 +1205,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/sovietvend
name = "KomradeVendtink"
desc = "Rodina-mat' zovyot!"
icon = 'icons/obj/citvending.dmi'
icon_state = "soviet"
vend_reply = "The fascist and capitalist svin'ya shall fall, komrade!"
product_slogans = "Quality worth waiting in line for!; Get Hammer and Sickled!; Sosvietsky soyuz above all!; With capitalist pigsky, you would have paid a fortunetink! ; Craftink in Motherland herself!"
@@ -1164,7 +1230,6 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
refill_canister = /obj/item/weapon/vending_refill/soviet
#undef STANDARD_CHARGE
#undef CONTRABAND_CHARGE
#undef COIN_CHARGE
@@ -81,11 +81,11 @@
target.visible_message("<span class='danger'>[chassis] drills [target] with [src].</span>", \
"<span class='userdanger'>[chassis] drills [target] with [src].</span>")
add_logs(user, target, "attacked", "[name]", "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
if(ishuman(target))
var/mob/living/carbon/human/H = target
H.apply_damage(drill_damage, BRUTE, "chest")
else if(target.stat == DEAD && target.butcher_results)
target.harvest(chassis) // Butcher the mob with our drill.
if(target.stat == DEAD)
if(target.butcher_results)
target.harvest(chassis)//Butcher the mob with our drill.
else
target.gib()
else
target.take_bodypart_damage(drill_damage)
@@ -198,7 +198,7 @@
/obj/item/mecha_parts/mecha_equipment/repair_droid/Destroy()
STOP_PROCESSING(SSobj, src)
if(chassis)
chassis.overlays -= droid_overlay
chassis.cut_overlay(droid_overlay)
return ..()
/obj/item/mecha_parts/mecha_equipment/repair_droid/attach(obj/mecha/M as obj)
@@ -207,7 +207,7 @@
M.add_overlay(droid_overlay)
/obj/item/mecha_parts/mecha_equipment/repair_droid/detach()
chassis.overlays -= droid_overlay
chassis.cut_overlay(droid_overlay)
STOP_PROCESSING(SSobj, src)
..()
@@ -219,7 +219,7 @@
/obj/item/mecha_parts/mecha_equipment/repair_droid/Topic(href, href_list)
..()
if(href_list["toggle_repairs"])
chassis.overlays -= droid_overlay
chassis.cut_overlay(droid_overlay)
if(equip_ready)
START_PROCESSING(SSobj, src)
droid_overlay = new(src.icon, icon_state = "repair_droid_a")
@@ -259,7 +259,7 @@
else //no repair needed, we turn off
STOP_PROCESSING(SSobj, src)
set_ready_state(1)
chassis.overlays -= droid_overlay
chassis.cut_overlay(droid_overlay)
droid_overlay = new(src.icon, icon_state = "repair_droid")
chassis.add_overlay(droid_overlay)
@@ -301,7 +301,7 @@
var/pow_chan
if(A)
for(var/c in use_channels)
if(A.master && A.master.powered(c))
if(A.powered(c))
pow_chan = c
break
return pow_chan
@@ -339,13 +339,13 @@
if(A)
var/pow_chan
for(var/c in list(EQUIP,ENVIRON,LIGHT))
if(A.master.powered(c))
if(A.powered(c))
pow_chan = c
break
if(pow_chan)
var/delta = min(20, chassis.cell.maxcharge-cur_charge)
chassis.give_power(delta)
A.master.use_power(delta*coeff, pow_chan)
A.use_power(delta*coeff, pow_chan)
+14 -3
View File
@@ -100,10 +100,21 @@
projectile = /obj/item/projectile/ion
fire_sound = 'sound/weapons/Laser.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla
equip_cooldown = 35
name = "\improper MKI Tesla Cannon"
desc = "A weapon for combat exosuits. Fires bolts of electricity similar to the experimental tesla engine"
icon_state = "mecha_ion"
origin_tech = "materials=4;combat=5;magnets=4"
energy_drain = 500
projectile = /obj/item/projectile/energy/tesla_cannon
fire_sound = 'sound/magic/lightningbolt.ogg'
/obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
equip_cooldown = 30
name = "eZ-13 MK2 heavy pulse rifle"
desc = "A weapon for combat exosuits. Shoots powerful destructive blasts capable of demloishing obstacles."
desc = "A weapon for combat exosuits. Shoots powerful destructive blasts capable of demolishing obstacles."
icon_state = "mecha_pulse"
energy_drain = 120
origin_tech = "materials=3;combat=6;powerstorage=4"
@@ -113,7 +124,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma
equip_cooldown = 10
name = "217-D Heavy Plasma Cutter"
desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demloishing solid obstacles."
desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demolishing solid obstacles."
icon_state = "mecha_plasmacutter"
item_state = "plasmacutter"
energy_drain = 30
@@ -380,7 +391,7 @@
//Classic extending punching glove, but weaponised!
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/punching_glove
name = "\improper Oingo Boingo Punch-face"
desc = "Equipment for clown exosuits. Delivers fun to right to your face!"
desc = "Equipment for clown exosuits. Delivers fun right to your face!"
icon_state = "mecha_punching_glove"
energy_drain = 250
equip_cooldown = 20
+2 -2
View File
@@ -160,7 +160,7 @@
updateUsrDialog()
sleep(get_construction_time_w_coeff(D))
use_power = 1
overlays -= "fab-active"
cut_overlay("fab-active")
desc = initial(desc)
var/location = get_step(src,(dir))
@@ -457,7 +457,7 @@
var/mat_overlay = "fab-load-[material2name(W.materials[1])]"
add_overlay(mat_overlay)
sleep(10)
overlays -= mat_overlay //No matter what the overlay shall still be deleted
cut_overlay(mat_overlay) //No matter what the overlay shall still be deleted
updateUsrDialog()
+1 -1
View File
@@ -96,7 +96,7 @@
const_holder.icon = 'icons/mecha/mech_construction.dmi'
const_holder.icon_state = "ripley0"
const_holder.density = 1
const_holder.overlays.len = 0
const_holder.cut_overlays(TRUE)
qdel(src)
return
+1 -1
View File
@@ -152,7 +152,7 @@
if(istype(W, /obj/item/device/mmi))
if(mmi_move_inside(W,user))
user << "[src]-[W] interface initialized successfuly"
user << "[src]-[W] interface initialized successfully."
else
user << "[src]-[W] interface initialization failed."
return
+4 -4
View File
@@ -114,7 +114,7 @@
/obj/item/mecha_parts/part/gygax_head
name = "\improper Gygax head"
desc = "A Gygax head. Houses advanced surveilance and targeting sensors."
desc = "A Gygax head. Houses advanced surveillance and targeting sensors."
icon_state = "gygax_head"
origin_tech = "programming=2;materials=4;magnets=3;engineering=3"
@@ -167,7 +167,7 @@
/obj/item/mecha_parts/part/durand_head
name = "\improper Durand head"
desc = "A Durand head. Houses advanced surveilance and targeting sensors."
desc = "A Durand head. Houses advanced surveillance and targeting sensors."
icon_state = "durand_head"
origin_tech = "programming=2;materials=3;magnets=3;engineering=3"
@@ -243,12 +243,12 @@
/obj/item/mecha_parts/part/honker_left_leg
name = "\improper H.O.N.K left leg"
desc = "A H.O.N.K left leg. The foot appears just large enough to fully accomodate a clown shoe."
desc = "A H.O.N.K left leg. The foot appears just large enough to fully accommodate a clown shoe."
icon_state = "honker_l_leg"
/obj/item/mecha_parts/part/honker_right_leg
name = "\improper H.O.N.K right leg"
desc = "A H.O.N.K right leg. The foot appears just large enough to fully accomodate a clown shoe."
desc = "A H.O.N.K right leg. The foot appears just large enough to fully accommodate a clown shoe."
icon_state = "honker_r_leg"
+1 -1
View File
@@ -46,7 +46,7 @@
/obj/mecha/working/ripley/update_icon()
..()
if (hides)
overlays = null
cut_overlays()
if(hides < 3)
add_overlay(image("icon" = "mecha.dmi", "icon_state" = occupant ? "ripley-g" : "ripley-g-open"))
else
+10 -2
View File
@@ -1,7 +1,7 @@
//########################## POSTERS ##################################
#define NUM_OF_POSTER_DESIGNS 36 // contraband posters
#define NUM_OF_POSTER_DESIGNS 44 // contraband posters
#define NUM_OF_POSTER_DESIGNS_LEGIT 35 // corporate approved posters
@@ -54,7 +54,15 @@ list(name = "- Punch Shit", desc = " Fight things for no reason, like a man!"),
list(name = "- The Griffin", desc = " The Griffin commands you to be the worst you can be. Will you?"),
list(name = "- Lizard", desc = " This lewd poster depicts a lizard preparing to mate."),
list(name = "- Free Drone", desc = " This poster commemorates the bravery of the rogue drone banned by CentComm."),
list(name = "- Busty Backdoor Xeno Babes 6", desc = " Get a load, or give, of these all natural Xenos!") )
list(name = "- Busty Backdoor Xeno Babes 6", desc = " Get a load, or give, of these all natural Xenos!"),
list(name = "- Robust Softdrinks", desc = " Robust Softdrinks: More robust than a toolbox to the head!"),
list(name = "- Shambler's Juice", desc = "~Shake me up some of that Shambler's Juice!~"),
list(name = "- Pwr Game", desc = "The POWER that gamers CRAVE! In partnership with Vlad's Salad."),
list(name = "- Sun-kist", desc = "Drink the stars!"),
list(name = "- Space Cola", desc = "Your favorite cola, in space."),
list(name = "- Space-Up!", desc = "Sucked out into space by the FLAVOR!"),
list(name = "- Kudzu", desc = "A poster advertising a movie about plants. How dangerous could they possibly be?"),
list(name = "- Masked Men", desc = "A poster advertising a movie about some masked men.") )
// LEGIT
+5
View File
@@ -23,3 +23,8 @@
/obj/effect/forcefield/mime/New()
..()
QDEL_IN(src, timeleft)
/obj/effect/forcefield/mime/advanced
name = "invisible blockade"
desc = "You're goona be here a while."
timeleft = 600
+7 -6
View File
@@ -11,12 +11,13 @@
victim << "<span class='danger'>*click*</span>"
/obj/effect/mine/Crossed(AM as mob|obj)
if(ismob(AM))
var/mob/MM = AM
if(!(MM.movement_type & FLYING))
if(isturf(loc))
if(ismob(AM))
var/mob/MM = AM
if(!(MM.movement_type & FLYING))
triggermine(AM)
else
triggermine(AM)
else
triggermine(AM)
/obj/effect/mine/proc/triggermine(mob/victim)
if(triggered)
@@ -169,4 +170,4 @@
victim.status_flags |= GOTTAGOREALLYFAST
sleep(duration)
victim.status_flags &= ~GOTTAGOREALLYFAST
victim << "<span class='notice'>You slow down.</span>"
victim << "<span class='notice'>You slow down.</span>"
@@ -169,3 +169,20 @@
/obj/structure/closet/crate/secure/loot = 20,
"" = 80
)
/obj/effect/spawner/lootdrop/organ_spawner
name = "organ spawner"
loot = list(
/obj/item/organ/heart/gland/bloody = 7,
/obj/item/organ/heart/gland/bodysnatch = 4,
/obj/item/organ/heart/gland/egg = 7,
/obj/item/organ/heart/gland/emp = 3,
/obj/item/organ/heart/gland/mindshock = 5,
/obj/item/organ/heart/gland/plasma = 7,
/obj/item/organ/heart/gland/pop = 5,
/obj/item/organ/heart/gland/slime = 4,
/obj/item/organ/heart/gland/spiderman = 5,
/obj/item/organ/heart/gland/ventcrawling = 1,
/obj/item/organ/body_egg/alien_embryo = 1,
/obj/item/organ/hivelord_core = 2)
lootcount = 3
+1
View File
@@ -163,6 +163,7 @@ var/explosionid = 1
I.throw_at(throw_at, throw_range, I.throw_speed)
if(TICK_CHECK)
stoplag()
var/circumference = (PI * init_dist * 2) + 8 //+8 to prevent shit gaps
if(exploded_this_tick.len > circumference) //only do this every revolution
for(var/Unexplode in exploded_this_tick)
+38 -25
View File
@@ -298,36 +298,50 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
var/obj/item/weapon/storage/S = W
if(S.use_to_pickup)
if(S.collection_mode) //Mode is set to collect multiple items on a tile and we clicked on a valid one.
if(isturf(src.loc))
if(isturf(loc))
var/list/rejections = list()
var/success = 0
var/failure = 0
for(var/obj/item/I in src.loc)
if(S.collection_mode == 2 && !istype(I,src.type)) // We're only picking up items of the target type
failure = 1
continue
if(I.type in rejections) // To limit bag spamming: any given type only complains once
continue
if(!S.can_be_inserted(I, stop_messages = 1)) // Note can_be_inserted still makes noise when the answer is no
if(S.contents.len >= S.storage_slots)
break
rejections += I.type // therefore full bags are still a little spammy
failure = 1
continue
var/list/things = loc.contents.Copy()
if (S.collection_mode == 2)
things = typecache_filter_list(things, typecacheof(type))
success = 1
S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
if(success && !failure)
user << "<span class='notice'>You put everything [S.preposition] [S].</span>"
else if(success)
user << "<span class='notice'>You put some things [S.preposition] [S].</span>"
else
user << "<span class='warning'>You fail to pick anything up with [S]!</span>"
var/len = things.len
if(!len)
user << "<span class='notice'>You failed to pick up anything with [S].</span>"
return
var/datum/progressbar/progress = new(user, len, loc)
while (do_after(user, 10, TRUE, S, FALSE, CALLBACK(src, .proc/handle_mass_pickup, S, things, loc, rejections, progress)))
sleep(1)
qdel(progress)
user << "<span class='notice'>You put everything you could [S.preposition] [S].</span>"
else if(S.can_be_inserted(src))
S.handle_item_insertion(src)
/obj/item/proc/handle_mass_pickup(obj/item/weapon/storage/S, list/things, atom/thing_loc, list/rejections, datum/progressbar/progress)
for(var/obj/item/I in things)
things -= I
if(I.loc != thing_loc)
continue
if(I.type in rejections) // To limit bag spamming: any given type only complains once
continue
if(!S.can_be_inserted(I, stop_messages = TRUE)) // Note can_be_inserted still makes noise when the answer is no
if(S.contents.len >= S.storage_slots)
break
rejections += I.type // therefore full bags are still a little spammy
continue
S.handle_item_insertion(I, TRUE) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
if (TICK_CHECK)
progress.update(progress.goal - things.len)
return TRUE
progress.update(progress.goal - things.len)
return FALSE
// afterattack() and attack() prototypes moved to _onclick/item_attack.dm for consistency
@@ -375,7 +389,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot.
A.Grant(user)
//sometimes we only want to grant the item's action if it's equipped in a specific slot.
/obj/item/proc/item_action_slot_check(slot, mob/user)
if(slot == slot_in_backpack || slot == slot_legcuffed) //these aren't true slots, so avoid granting actions there
@@ -493,7 +506,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_s
var/index = blood_splatter_index()
var/icon/blood_splatter_icon = blood_splatter_icons[index]
if(blood_splatter_icon)
overlays -= blood_splatter_icon
cut_overlay(blood_splatter_icon)
/obj/item/clothing/gloves/clean_blood()
. = ..()
-2
View File
@@ -146,10 +146,8 @@
/obj/item/areaeditor/proc/get_area()
var/turf/T = get_turf(usr)
var/area/A = T.loc
A = A.master
return A
/obj/item/areaeditor/proc/get_area_type(area/A = get_area())
if(A.outdoors)
return AREA_SPACE
-5
View File
@@ -21,11 +21,6 @@
R.add_fingerprint(user)
qdel(src)
/obj/item/weapon/storage/box/bodybags
name = "body bags"
desc = "The label indicates that it contains body bags."
icon_state = "bodybags"
/obj/item/weapon/storage/box/bodybags/New()
..()
for(var/i in 1 to 7)
+6 -6
View File
@@ -61,7 +61,7 @@
user << "Your name has been sent to your employers for approval."
// Autoapproves after a certain time
response_timer_id = addtimer(CALLBACK(src, .proc/rename_station, new_name, user), approval_time, TIMER_STOPPABLE)
response_timer_id = addtimer(CALLBACK(src, .proc/rename_station, new_name, user.name, user.real_name, key_name(user)), approval_time, TIMER_STOPPABLE)
admins << "<span class='adminnotice'><b><font color=orange>CUSTOM STATION RENAME:</font></b>[key_name_admin(user)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) proposes to rename the station to [new_name] (will autoapprove in [approval_time / 10] seconds). (<A HREF='?_src_=holder;BlueSpaceArtillery=\ref[user]'>BSA</A>) (<A HREF='?_src_=holder;reject_custom_name=\ref[src]'>REJECT</A>) (<a href='?_src_=holder;CentcommReply=\ref[user]'>RPLY</a>)</span>"
/obj/item/station_charter/proc/reject_proposed(user)
@@ -80,20 +80,20 @@
deltimer(response_timer_id)
response_timer_id = null
/obj/item/station_charter/proc/rename_station(designation, mob/user)
/obj/item/station_charter/proc/rename_station(designation, uname, ureal_name, ukey)
if(config && config.server_name)
world.name = "[config.server_name]: [designation]"
else
world.name = designation
station_name = designation
minor_announce("[user.real_name] has designated your station as [station_name()]", "Captain's Charter", 0)
log_game("[key_name(user)] has renamed the station as [station_name()].")
minor_announce("[ureal_name] has designated your station as [station_name()]", "Captain's Charter", 0)
log_game("[ukey] has renamed the station as [station_name()].")
name = "station charter for [station_name()]"
desc = "An official document entrusting the governance of \
[station_name()] and surrounding space to Captain [user]."
[station_name()] and surrounding space to Captain [uname]."
if(!unlimited_uses)
used = TRUE
#undef STATION_RENAME_TIME_LIMIT
#undef STATION_RENAME_TIME_LIMIT
+1 -8
View File
@@ -416,7 +416,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/alert_s = input(U,"Alert severity level","Ping Drones",null) as null|anything in list("Low","Medium","High","Critical")
if(A && alert_s)
var/msg = "<span class='boldnotice'>NON-DRONE PING: [U.name]: [alert_s] priority alert in [A.name]!</span>"
_alert_drones(msg, 1)
_alert_drones(msg, TRUE)
U << msg
@@ -999,13 +999,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
user << "You do not have a PDA. You should make an issue report about this."
//Some spare PDAs in a box
/obj/item/weapon/storage/box/PDAs
name = "spare PDAs"
desc = "A box of spare PDA microcomputers."
icon = 'icons/obj/storage.dmi'
icon_state = "pda"
/obj/item/weapon/storage/box/PDAs/New()
..()
new /obj/item/device/pda(src)
@@ -4,7 +4,6 @@
icon_state = "megaphone"
item_state = "radio"
w_class = WEIGHT_CLASS_SMALL
flags = FPRINT
siemens_coefficient = 1
var/spamcheck = 0
var/emagged = 0
@@ -93,10 +93,6 @@
var/newlaws = copytext(sanitize(input("Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", pai.laws.supplied[1]) as message),1,MAX_MESSAGE_LEN)
if(newlaws && pai)
pai.add_supplied_law(0,newlaws)
pai << "Your supplemental directives have been updated. Your new directives are:"
pai << "Prime Directive : <br>[pai.laws.zeroth]"
for(var/slaws in pai.laws.supplied)
pai << "Supplemental Directives: <br>[slaws]"
if(href_list["toggle_holo"])
if(pai.canholo)
pai << "<span class='userdanger'>Your owner has disabled your holomatrix projectors!</span>"
@@ -56,7 +56,7 @@
if(((world.timeofday - last_tick) > 30) || ((world.timeofday - last_tick) < 0))
last_tick = world.timeofday
var/area/A = get_area_master(src)
var/area/A = get_area(src)
if(!A || emped)
on = 0
else
+1 -1
View File
@@ -125,7 +125,7 @@ MASS SPECTROMETER
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.heart_attack && H.stat != DEAD)
if(H.undergoing_cardiac_arrest() && H.stat != DEAD)
user << "<span class='danger'>Subject suffering from heart attack: Apply defibrillator immediately!</span>"
if(iscarbon(M))
@@ -267,7 +267,7 @@
/obj/item/device/tape/proc/fix()
overlays -= "ribbonoverlay"
cut_overlay("ribbonoverlay")
ruined = 0
@@ -192,8 +192,6 @@ var/global/list/datum/stack_recipe/reinforced_glass_recipes = list ( \
var/mob/living/carbon/human/H = AM
if(PIERCEIMMUNE in H.dna.species.species_traits)
return
if(H.dna.species.id == "slime" || "jelly")
return
var/picked_def_zone = pick("l_leg", "r_leg")
var/obj/item/bodypart/O = H.get_bodypart(picked_def_zone)
if(!istype(O))
@@ -211,4 +209,4 @@ var/global/list/datum/stack_recipe/reinforced_glass_recipes = list ( \
"<span class='userdanger'>You slide on the broken glass!</span>")
cooldown = world.time
H.Weaken(3)
H.Weaken(3)
@@ -1,12 +1,13 @@
/* Diffrent misc types of sheets
* Contains:
* Metal
* Plasteel
* Wood
* Cloth
* Cardboard
* Runed Metal (cult)
* Brass (clockwork cult)
* Metal
* Plasteel
* Wood
* Cloth
* Plastic
* Cardboard
* Runed Metal (cult)
* Brass (clockwork cult)
*/
/*
@@ -357,3 +358,27 @@ var/global/list/datum/stack_recipe/brass_recipes = list ( \
throw_speed = 1
throw_range = 3
origin_tech = "materials=2;biotech=2"
var/global/list/datum/stack_recipe/plastic_recipes = list(
new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = 1, on_floor = 1, time = 40))
/obj/item/stack/sheet/plastic
name = "plastic"
desc = "Compress dinosaur over millions of years, then refine, split and mold, and voila! You have plastic."
singular_name = "plastic sheet"
icon_state = "sheet-plastic"
throwforce = 7
flags = CONDUCT
origin_tech = "materials=1"
origin_tech = "materials=1;biotech=1"
merge_type = /obj/item/stack/sheet/plastic
/obj/item/stack/sheet/plastic/fifty
amount = 50
/obj/item/stack/sheet/plastic/five
amount = 5
/obj/item/stack/sheet/plastic/New()
recipes = plastic_recipes
. = ..()
+20
View File
@@ -0,0 +1,20 @@
/obj/item/taster
name = "taster"
desc = "Tastes things, so you don't have to!"
icon = 'icons/obj/surgery.dmi'
icon_state = "tonguenormal"
w_class = WEIGHT_CLASS_TINY
var/taste_sensitivity = 15
/obj/item/taster/get_spans()
return list()
/obj/item/taster/afterattack(atom/O, mob/user, proximity)
if(!proximity)
return
if(O.reagents)
var/message = O.reagents.generate_taste_message(taste_sensitivity)
user << "<span class='notice'>[src] tastes <span class='italics'>[message]</span> in [O].</span>"
@@ -57,10 +57,9 @@ AI MODULES
message_admins("[key_name_admin(user)] tried to upload laws to [law_datum.owner ? key_name_admin(law_datum.owner) : "an AI core"] that would exceed the law cap.")
overflow = TRUE
var/law2log = src.transmitInstructions(law_datum, user, overflow) //Freeforms return something extra we need to log
var/law2log = transmitInstructions(law_datum, user, overflow) //Freeforms return something extra we need to log
if(law_datum.owner)
user << "<span class='notice'>Upload complete. [law_datum.owner]'s laws have been modified.</span>"
law_datum.owner.show_laws()
law_datum.owner.law_change_counter++
else
user << "<span class='notice'>Upload complete.</span>"
@@ -75,7 +74,7 @@ AI MODULES
//The proc that actually changes the silicon's laws.
/obj/item/weapon/aiModule/proc/transmitInstructions(datum/ai_laws/law_datum, mob/sender, overflow = FALSE)
if(law_datum.owner)
law_datum.owner << "<span class='userdanger'>[sender] has uploaded a change to the laws you must follow using a [name]. From now on, these are your laws: </span>"
law_datum.owner << "<span class='userdanger'>[sender] has uploaded a change to the laws you must follow using a [name].</span>"
/******************** Modules ********************/

Some files were not shown because too many files have changed in this diff Show More