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:
+21
-22
@@ -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)
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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,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
|
||||
|
||||
/*
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)])"
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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]"
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
else
|
||||
icon_state = "donateidle"
|
||||
|
||||
overlays = null
|
||||
cut_overlays()
|
||||
|
||||
if(beaker)
|
||||
if(attached)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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()
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
. = ..()
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user